すぐマク Excel VBA Board

30444
Excel VBA Board
画像クリックで拡大。レスのついた質問は削除しない。回答には返礼を!
お名前
件名
メッセージ
画像
メールアドレス
ホームページ
文字色
編集/削除キー (半角英数字のみで4〜8文字)
プレビューする (投稿前に、内容をプレビューして確認できます)

メモ帳書き出し - 鶏肋

2009/07/02 (Thu) 22:08:06

こんにちは。
excelの内容のメモ帳書き出しについて質問です。
以下のようなことをしたいのですが。
(1)excelのセルA1からデータの入っているところまでをメモ帳に書き出す。
(2)メモ帳に「sample」という名前を付けてデスクトップに保存する(拡張子も変更)
(3)もしすでに「sample」という名前のファイルがあったら上書き(上書き確認メッセージ表示しない)。
なければそのまま「sample」という名前を付けて保存
(4)メモ帳を閉じる。

そこで以下のようなマクロを書いてみました。

sub memo()

Dim taskID As Double
Dim copyRange As Range

taskID = Shell("Notepad.exe", vbNormalFocus)
Range("A1").Select
Set copyRange = Range(Selection, Selection.End(xlDown))
copyRange.Copy

AppActivate taskID
SendKeys "^v", True
SendKeys "%FA", True
SendKeys "%N", True
SendKeys "sample.bat", True
SendKeys "{Enter}", True
SendKeys "%Y", True
SendKeys "%FX", True

end sub


このマクロでは、「sample」というファイルがないときは(1)〜(4)の内容が実行できるのですが、「sample」というファイルがあるときは、「上書きしますか」というメッセージが出てマクロが止まってしまうことがよくあります。
しかし、止まってしまうのも毎回ではなく、たまにそのまま上書きできることもあります。

ただ、さきほどのマクロの前後に別の内容が加わり長いマクロになると、ほぼ100%自動上書きず、「上書きしますか」のメッセージが出てきてマクロが止まってしまいます。

原因がよくわからないのですが、これはexcelが不安定ということであきらめるしかないのでしょうか。

何かよい解決案はございますでしょうか。

よろしくお願いいたします。

Re: メモ帳書き出し - 永井善王 Home

2009/07/03 (Fri) 10:45:57

マクロの最初(メモ帳の処理より前)に、"sample.bat" があれば削除するコードを入れておく方法をお勧めします。
参考ページ
・デスクトップのパスを取得する http://www.asahi-net.or.jp/~zn3y-ngi/YNxv201.html#2-2
 (必要により、ChDrive、ChDirを行います。 )
・ブックを削除する http://www.asahi-net.or.jp/~zn3y-ngi/YNxv202.html#5
 (拡張子を .bat に変えれば使えます。)

Re: メモ帳書き出し - 鶏肋

2009/07/03 (Fri) 22:56:34

できました!
sendkeysがだめなら、killは使えないかと思っていたのですが、デスクトップのパスがCドライブやDドライブに固定されてしまうのではないかと思い、そちら方向で考えるのをあきらめていました。
しかし、教えていただいた方法で融通の利くデスクトップのパスを取得できることを知り、無事解決できました。
大変勉強になりました。
永井善王にはたびたび助けていただき、感謝いたします。
ありがとうございました。

ファイル名一覧表自動作成 鶏肋

2009/06/22 (Mon) 21:42:37

こんにちは。
現在、特定のフォルダ内にあるファイル名をexcelに一覧として自動作成したいのですが、自分でできるのは下記のようなところまでです。


Sub FileName()

Dim myFileName As String
Const myDir As String = "C:\"

Application.ScreenUpdating = False
Cells.Clear
Range("A2").Value = "ファイル名"

myFileName = Dir(myDir & "*", vbHidden + vbSystem)

While myFileName <> vbNullString
Cells(Rows.Count, 1).End(xlUp).Offset(1).Value _
= myFileName
myFileName = Dir()
Wend

Columns(1).AutoFit
Application.ScreenUpdating = True

End Sub

これだと対象となるファイルがCドライブの直下のフォルダのときはいいのですが、そうでないときは、困ります。業務プロジェクトごとにフォルダがあるので、いちいちそれをCドライブの直下フォルダにコピーペーストするのも大変です。
また、人によってデータを保存しているドライバが違うので、同僚に渡したとき、いちいち"C:\"のところを変えなければなりません。

で、質問なのですが、"C:\"のところを例えば、「アクティブシートのA1セルに記されたパス名を参照する」などのようにしたいのですが、どうすればよいのかわかりません。

ご教示よろしくお願いいたします。

Re: ファイル名一覧表自動作成 - 永井善王 Home

2009/06/23 (Tue) 08:08:54

あまり時間がないのでポイントだけですが、下記マクロで何とかなりませんか。
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "フォルダを選択して [OK]をクリックしてください。"
.Show
myDir = .SelectedItems(1)
End With
参考ページ … http://www.asahi-net.or.jp/~zn3y-ngi/YNxv201.html#5

Re: ファイル名一覧表自動作成 - 鶏肋

2009/06/23 (Tue) 13:53:29

早速のご回答ありがとうございます。
ただ、私のやり方が悪いのか思ったとおりに動きません。

Sub FileName()

With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "フォルダを選択して [OK]をクリックしてください。"
.Show
myDir = .SelectedItems(1)
End With

Dim myFileName As String

Application.ScreenUpdating = False
Cells.Clear
Range("A2").Value = "ファイル名"

myFileName = Dir(myDir & "*", vbHidden + vbSystem)

While myFileName <> vbNullString
Cells(Rows.Count, 1).End(xlUp).Offset(1).Value _
= myFileName
myFileName = Dir()
Wend

Columns(1).AutoFit
Application.ScreenUpdating = True

End Sub

初心者なので、いったい何が原因なのかよくわかりません。お手数をおかけしますがよろしくお願いいたします。

Re: ファイル名一覧表自動作成 - 永井善王 Home

2009/06/23 (Tue) 21:52:59

そもそも、「Cドライブの直下のフォルダのときはいいのですが、そうでないときは、困ります」ということで、その解決策を知りたいのでしたね。
最初のマクロで出来た一覧と、修正後のマクロでCドライブのルートを選択して[OK]ボタンをクリックして出来た一覧とは、同じではなかったですか。

「思ったとおりに動きません。」ということですが、あなたがどう思っているのかは、あなた自身が説明しないと他人に分かってもらうことはできないでしょうね。
最初の質問で「特定のフォルダ内にあるファイル名を一覧にしたい」ということでしたが、Dir(myDir & "*", vbHidden + vbSystem) として、隠しファイルとシステムファイルだけに限定しているのは不可解ですが、これでよいのですか。

Re: ファイル名一覧表自動作成 - 鶏肋

2009/06/24 (Wed) 10:15:19

言葉が足りず申し訳ございません。
思うように動かないというのは、以下のようなことです。
最初のマクロでできたものと、教えていただいたマクロでCドライブを選択したときの結果は同じものが得られました。
ですが、Cドライブのさらに下のフォルダ内のファイルの一覧を作ろうとすると、たとえば "C:\2009_06Project\"などにすると最初のマクロでは一覧になりますが、教えていただいたマクロでは一覧が表示されません。
つまり、子フォルダのファイル一覧は作れますが、孫フォルダ以下のファイル一覧が作れません。
思うように動かないというのはこういうことでした。


Dir(myDir & "*", vbHidden + vbSystem) は、隠しファイルとシステムファイルに限定しているのではなく、隠しファイルとシステムファイルも含めて一覧表を作るというつもりで書いたのですが。。。
Dir(myDir & "*")に書き換えてマクロを起動してみましたが、やっぱり孫フォルダは一覧表が作成されませんでした。

また、ファイル名の中に、中国語や韓国語などがある場合、一覧表で文字化けしてしまうのですが、これは日本語OSでマクロを起動している以上避けられないことなのでしょうか。

お忙しい中、たびたびお手数をおかけいたしますが、よろしくお願いいたします。




Re: ファイル名一覧表自動作成 - 永井善王 Home

2009/06/24 (Wed) 21:06:08

子フォルダというのは C:\ のことで、孫フォルダは C:\2009_06Project\ のことでしょうか?
そのことは置いておいて。
お教えしたマクロの上から4行目を下記のように修正して実行してみて、結果をお知らせください。
myDir = .SelectedItems(1) & "\"

Re: ファイル名一覧表自動作成 - 鶏肋

2009/06/25 (Thu) 10:33:38

できました!
4行目をmyDir = .SelectedItems(1) & "\"に変えたら、子フォルダ、孫フォルダとも一覧が作れました。これで仕事がはかどります。
相変わらず中国語や韓国語は文字化けしてしまいますが、ファイル名を英語にすれば何とか。。。
お忙しい中、ご丁寧にご回答くださりありがとうございました。

年ごとにフィルタ抽出したものを別のシートにコピーしたい - SI

2009/06/16 (Tue) 16:14:59

はじめまして、マクロを少しかじった程度のレベルなのでご教授ください。
データを年ごとにフィルタ抽出したものを別のシートにコピーしたいのですが、
マクロでかのうでしょうか? 原本のデータをほかのシートには1回のみできるのですが貼り付けるシートを変更できません。よろしかったら教えてください。
現在このようにマクロしています。

For I = 2004 To 2009 Step 1
Sheets("D").Select
Range("G2") = I
Call 年別抽出
Sheets("2004").Select
Range("A11").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Sheets("D").Select
Range("F2").Select
Next I

Sub 年別抽出()
Range("C2:D2").Select
Selection.Copy
Range("C5").Select
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
Range("A11:FZ2696").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:= _
Range("C4:D5"), Unique:=False
Range("A11").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Range("A11:FZ2697").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
End Sub

シートを替えるにはどのようなマクロがいいでしょうか?

Re: 年ごとにフィルタ抽出したものを別のシートにコピーしたい - 永井善王 Home

2009/06/16 (Tue) 16:37:05

貼り付けるシート名が変更できればよいのですね。
上から5行目のコード「 Sheets("2004").Select 」を下記のように修正すればよいと思います。
シート名 = Right(Str(I), 4)
Sheets(シート名).Select

Re: 年ごとにフィルタ抽出したものを別のシートにコピーしたい 井下 純代

2009/06/17 (Wed) 09:51:22

解答ありがとうがざいました。
さっそくやってみたのですが、
Sheets("2004") = Right(Str(I), 4)
Sheets("2004").Select
このようになると思い入力してみました。
しかし、デパックがでてマクロが作動しません。
それと(Str(I))のIは何をさすのでしょうか?
おしえていただけると幸いです。

Re: 年ごとにフィルタ抽出したものを別のシートにコピーしたい - 永井善王 Home

2009/06/17 (Wed) 17:57:29

教えてあげたとおりに入力してみたが上手くいかなかったということですか?
Sheets("2004") = Right(Str(I), 4)
と入力したのであれば目茶苦茶ですよ。考えすぎましたね。

Iには、あなたが作った1行目のFor...Next文で、最初は2004が入り、2回目は2005、3回目は2006、(以後省略) となるのとは違いますか。

Re: 年ごとにフィルタ抽出したものを別のシートにコピーしたい SI

2009/06/18 (Thu) 14:37:18

ほんとうに考えすぎでした。助かりました。
ありがとうございます。
マクロをもっと勉強します。

投稿者削除 (削除)

2009/06/13 (Sat) 14:06:28

(投稿者により削除されました)

データ型は? - 永井善王 Home

2009/06/14 (Sun) 07:23:17

もしかして、Sheet1のA列に入っている「社員ID」が数値型ならば、
検索データ = InputBox("検索データを入力して下さい。" & "例) 1000 ") を
検索データ = Val(InputBox("検索データを入力して下さい。" & "例) 1000 ")) と
修正すればよろしいかと。
理由は、InputBox関数は文字列型の値を返してくれるからで、ユーザーフォームのテキストボックスも同じです。

ダイアログ [キャンセル] で実行時エラーになってしまいます。 - かずお

2009/06/03 (Wed) 16:13:39

 お世話になります。ダイアログから保存ファイルを選択しモードレスでユーザーフォームの表示はできるのですが、ダイアログを [キャンセル] した場合には「実行時エラー'9':インデックスが有効範囲にありません。」となってしまいます。どのようにしたら宜しいでしょうか、御教授をお願い致します


Private Sub CommandButton1_Click
Me.Hide
ChDrive "D"
ChDir "D:"
Application.Dialogs(xlDialogOpen).Show
UserForm2.Show
End Sub

UserForm2.Showのところでエラーになります。以上ですが宜しくお願い致します。

マクロの制御 山村 清

2009/05/14 (Thu) 21:21:04

マクロをマクロで制御したいのですができるでしょうか?

Re: マクロの制御 - 永井善王 Home

2009/05/15 (Fri) 07:49:09

どんなマクロをどのように制御したいのですか? たとえば下記ページの 「タイマーを使った制御」
http://www.asahi-net.or.jp/~zn3y-ngi/YNxv214.html#8-1
あるいは、下記ページにいろいろある [自動運転]
http://www.asahi-net.or.jp/~zn3y-ngi/YNxv20.html
みたいなことなのか、具体的に示された方が回答を得られやすいと思います。

インディクスが有効範囲にありませんのエラーがでてしまいます。 - かずお

2009/05/14 (Thu) 10:36:20

お世話になります。同じシート名(サンプル)のある他のブックに貼り付け動作確認をしたところエラーになってしまいました。言葉が足りずにすみません。 
 位置として以下の◇マークのところに入れたいのですが宜しくお願い致します。

Private Sub CommandButton1_ClicK()

'◇

Columns("B:B").Select
Selection.ColumnWidth = 7.38
Rows("1:1").Select
Selection.RowHeight = 24.5
Selection.VerticalAlignment = xlCenter
Range("B1").Select
ActiveCell.FormulaR1C1 = "タイトル:"
Range("H1").Select
ActiveCell.FormulaR1C1 = "=TODAY()"
Range("C1:F1").Select
Selection.Merge
With Selection
.HorizontalAlignment = xlLeft
End With
Application.DisplayFormulaBar = False
ActiveWindow.DisplayHeadings = False
ActiveWindow.DisplayGridlines = False
Range("B3").Value = "測点"
Range("C3").Value = "距離"
Range("D3").Value = "内角"
Rows("3:3").Select
Selection.HorizontalAlignment = xlCenter
Range("B3").Select
ActiveCell.CurrentRegion.Select
Selection.Borders.LineStyle = xlContinuous
Range("B1:F1").Select
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
End With
Range("C1").Select
Me.Hide
UserForm1.Show
End Sub

Re: インディクスが有効範囲にありませんのエラーがでてしまいます。 - 永井善王 Home

2009/05/14 (Thu) 11:45:18

追加で示されたコードはユーザーフォームのコードですね?
◇マークのところへ最初に示されたコードを入れて実行すると、そこでエラーが出るのですね?
エラーメッセージは?

右図(クリックで拡大可能)の状態で下記マクロを実行するとエラーは出ませんが。

Private Sub CommandButton1_Click()
ここへ最初に示されたマクロ(23行)を入れる
End Sub

※いちいち新しい板を作らないで、最初の質問の[返信]ボタンをクリックして追加書き込みしてください。

インディクスが有効範囲にありませんのエラーがでてしまいます。 - かずお

2009/05/13 (Wed) 13:51:13

 お世話になります。 作業用シートの有無を調べて無ければ追加し、有れば「作業シートを確認しました」のメッセージを出すようにしました。
 テストでは問題はありませんでしたが、同じシート名(サンプル)のある他シートではエラーがでてしまいます。どの様にしたら宜しいか御教授をお願いします。

Dim mySht As Worksheet
Dim rg As Range
Worksheets("サンプル").Select
Columns(1).Clear
Range("A1").Value = "シート名"
For Each mySht In Worksheets
Cells(Rows.Count, 1).End(xlUp).Offset(1).Value = mySht.Name
Next
Set mySht = Nothing
Worksheets("サンプル").Select
Set rg = Cells.Find("トラ")
If rg Is Nothing Then
MsgBox "作業シートを作成します。"
Worksheets.Add.Move after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = "トラ"
Else
MsgBox "作業シートを確認しました。"
End If
Worksheets("サンプル").Select
Columns(1).Clear
Range("A1").Select
Worksheets("トラ").Select
Set rg = Nothing

 以上ですが宜しくお願い致します。

Re: インディクスが有効範囲にありませんのエラーがでてしまいます。 - 永井善王 Home

2009/05/13 (Wed) 18:42:22

「同じシート名(サンプル)のある他シート」とはどういうことでしょうか?

型が一致しませんの実行時エラーが出てしまいます。 - かずお

2009/05/05 (Tue) 23:36:16

連絡が遅くなりすみません。その後いろいろと試したところサクッと行きました。元文を残さず弄り過ぎて比較出来ませんが、おそらく以下省略で省きましたEnd Ifの位置がまずかった様です。
 貧弱な説明を質問としてすみませんでした。
本質問は取り下げさせて頂きます。
 

投稿者削除 - (削除)

2009/04/30 (Thu) 14:35:05

(投稿者により削除されました)


Copyright © since 2004 FC2 Inc. All Rights Reserved.