- ベストアンサー
このマクロを実行し、表示させるにはどうしたらよいですか?
恐れ入ります。初心者です。WinXP、Excel 2002を使用。VBAコードは読めません。 「本gooのカテゴリ」について、まだ把握してなく、別カテゴリで同質問してしまい、その回答者様に当「Office系ソフトのカテゴリ」へとご指示されました。 質問がダブってしまいましたが、よろしくお願い致します。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1432630 のページ の回答者No.2様のマクロを実行し、表示させるにはどうしたらよいですか? このままコピーしましたが、実行できませんでした。 私のやり方(解釈)が間違っていたのだと解りました。 別のコードを追加しないと、実行できないのでしたら、何かサンプル的コードで構いませんので、 このマクロを実行し表示させる方法が、おありでしたら教えてくださいませ。 1、コピー&ペーストから、詳しく教えて下さいませ。 2、Module1とModule2を個々のマクロで実行し、表示する方法も併せて教えて下さいませ。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
書き方が悪かったですね。#8 の「サブルーチンには、~」以降は何故エラー になるのかの解説です。Workbooks.Open ~の部分は変更する必要はありませ ん。#8 での修正は次の部分だけです。 <修正前> ' ここで作成済みのマクロを呼び出す ----------------------- Call テスト(strFoundFile) '<--- 修正(ご自分のマクロ呼び出し) '--------------------------------------------------------- <修正後> 'ここで作成済みのマクロを呼び出す ------------------------ Call テスト(strFolderPath & strFoundFile) '--------------------------------------------------------- まずは、この部分だけ直して実行してみて下さい。それで、うまくいくと 思います。疑問があれば、再度補足して下さい。
その他の回答 (8)
- KenKen_SP
- ベストアンサー率62% (785/1258)
> フォルダの参照→OK→「Error(1004)、 > …xls`が見つかりません。ファイルおよびファイルの保存場所が正しいか > どうか確認してください。…。」となりました このような情報をいただけると非常に助かります。ありがとうございます^^ 原因は、完全に私のミスですね。すみません。 'ここで作成済みのマクロを呼び出す ------------------------ Call テスト(strFolderPath & strFoundFile) '--------------------------------------------------------- このように直してみて下さい。サブルーチンには、 「フォルダのパス」=ファイルの場所 を含めた情報を渡さなければなりませんでした。 × Workbooks.Open Filename:="test.xls" ファイル名は分かるが、どこにあるファイルなのか分からない -->ブックを開くことができず、1004番のエラー発生 ○ Workbooks.Open Filename:="C:\test.xls" ファイルの場所、ファイル名ともに分かるのでブックを開くことが可 どうでしょうか?
補足
大変恐れいります。 また、同じ→「Error(1004)、…」となりました。 ご確認ですが、 ' ブックを開く ---> 開かれたブックがアクティブになる Workbooks.Open Filename:=strFilename ↓を ' ブックを開く ---> 開かれたブックがアクティブになる Workbooks.Open Filename:="C:\test.xls" でよろしいでしょうか? 私の場合、今度は、Cドライブに「新しいフォルダ」として置いてみましたが、 Workbooks.Open Filename:="C:\*.xls" (しかし、これも、同じエラーでした) としなくてもよいのですね。 よろしくお願い致します。
- KenKen_SP
- ベストアンサー率62% (785/1258)
> ...下記のようにそのまま貼り付けてしまってよろしいでしょうか? 私が提示したサンプルを実行するなら、その通りです。それから、 ' ここで作成済みのマクロを呼び出す ----------------------- MsgBox strFoundFile '(EX) '--------------------------------------------------------- ↓ ' ここで作成済みのマクロを呼び出す ----------------------- Call テスト(strFoundFile) '<--- 修正(ご自分のマクロ呼び出し) '--------------------------------------------------------- も修正して下さい。 回答をよくお読みいただければ、その様に書いてあるはずです。私が回答 するときは専門用語は必要最小限しか使わず、なるべくご質問者様の立場 に立った回答になるように気をつけています。また、一度係わった以上は 私の回答なり、他の方の回答で、それなりの解決に至るまでは何度でも サポート致します。 もちろんそれが不十分であったり、ご質問の意図を外してトンチンカンな 回答をしてしまう場面も多々ありますが、少なくとも今回補足頂いた内容 は、 「聞く前に試してみる」 というのが抜けていると言うか、何と言うのでしょう、初心者とかの次元の 話では無い所に問題がある気がするのです。 「こうやってみたけど、うまくいかなかった。なぜか?」 という補足を頂けたら嬉しかったのですが....試してみればわかることで すよね。
補足
はい、2箇所修正して実行して見ましたが、フォルダの参照→OK→「Error(1004)、 `…xls`が見つかりません。ファイルおよびファイルの保存場所が正しいかどうか確認してください。…。」となりました。 但し、修正前は、 フォルダの参照→OK→Microsoft Excel→OK、OKで終了しました。 ちなみに、デスクトップにフォルダを作り、xlsファイルを2つ入れてあります。 以上よろしくお願い致します。
- KenKen_SP
- ベストアンサー率62% (785/1258)
▼ ご自分で作成されたマクロの修正 > そのマクロを走らせるとファイル名を聞いてきまして、そこでファイル名を > 入力してやれば、ある操作を施したあと自動的に上書き保存までしてくれる と前回のご質問にあります。例えば、こんな感じのマクロだとしましょう。 Sub テスト() Dim strFilename As String strFilename = InputBox("ファイル名は?") If strFilename = "" Then Exit Sub End If ' ブックを開く ---> 開かれたブックがアクティブになる Workbooks.Open Filename:=strFilename ' アクティブシートの A1 セルに値を書き込む ActiveSheet.Range("A1").Value = "Sample Data" ' 変更を保存して閉じる ActiveWorkbook.Close SaveChanges:=True End Sub これを次のように修正します。要はファイル名取得の部分が自動化されたので、 それを変数としてマクロに渡し、ブックを開く命令に使います。上と下の違い をよくご覧下さい。 Sub テスト(strFilename As String) '<---- <<注目>> If strFilename = "" Then Exit Sub End If ' ブックを開く ---> 開かれたブックがアクティブになる Workbooks.Open Filename:=strFilename ' アクティブシートの A1 セルに値を書き込む ActiveSheet.Range("A1").Value = "Sample Data" ' 変更を保存して閉じる ActiveWorkbook.Close SaveChanges:=True End Sub ▼ この修正されたマクロを、Module2 の末尾に貼り付けます ▼ 次に、マクロ「フォルダ内全ブックの順次処理」の次の様に修正します ' ここで作成済みのマクロを呼び出す ----------------------- MsgBox strFoundFile '(EX) '--------------------------------------------------------- ↓ ' ここで作成済みのマクロを呼び出す ----------------------- Call テスト(strFoundFile) '<--- 修正(ご自分のマクロ呼び出し) '--------------------------------------------------------- このような感じですが、よく意味が分からなければ、ご自分で作成された コードを補足して下さい。
補足
ご回答誠に有難うございます。 大変申し訳ありませんが、下記のようにそのまま貼り付けてしまってよろしいでしょうか? >▼ この修正されたマクロを、Module2 の末尾に貼り付けます End Sub Sub テスト(strFilename As String) '<---- <<注目>> If strFilename = "" Then Exit Sub End If ' ブックを開く ---> 開かれたブックがアクティブになる Workbooks.Open Filename:=strFilename ' アクティブシートの A1 セルに値を書き込む ActiveSheet.Range("A1").Value = "Sample Data" ' 変更を保存して閉じる ActiveWorkbook.Close SaveChanges:=True End Sub '■■■■■ 【 Module2 ここまで 】 ■■■■■■■■■■■■■■■■
- bonaron
- ベストアンサー率64% (482/745)
Office2003(たぶんXPも)だったら、 FileDialog が使えて、 フォルダの取得が簡単にできるんですけどね。 Accessユーザーにとっては、 ファイル名を取得できるだけでも大変な進歩です。
お礼
そうなんですね、どうも有難うございます。
- KenKen_SP
- ベストアンサー率62% (785/1258)
何気にクリックしたら私が前に書いたコードだったのでビックリしました^^; どうも混乱させてしまった様で、すみませんでした。 記述の方法は、他の回答者様がご説明下さいましたので省略しますが、前回書 いたコードにはバグがあって、、ルートフォルダを選択すると¥記号が2重に なってしまい、うまく動かなかったのかもしれません。 C:\\ <---こんな感じのパスが BrowseForFolder の戻り値になってしまう バグフィックスし、若干余計なモノをカット、必要なモノを多少加筆したもの を再掲しておきます。 UNC 変換部は、会社など複数の PC で使うには必要だと思いますので、残して おきました。フォルダ選択ダイアログは Shell を使った簡易な方法もあります が、環境により動作が微妙に違うなど不安定要素がありますので、あえて API を使ってます。 以下ソースコードです。 '■■■■■ 【 Module1 にコピー&ペースト 】 ■■■■■■■■■■■ Option Explicit ' フォルダ選択ダイアログ ' API Private Declare Function SHBrowseForFolder Lib "shell32.dll" ( _ lpbi As BROWSEINFO) As Long Private Declare Function SHGetPathFromIDList Lib "shell32" ( _ ByVal pidl As Long, ByVal pszPath As String) As Long Private Declare Function WNetGetConnection Lib "mpr.dll" Alias "WNetGetConnectionA" ( _ ByVal lpszLocalName As String, _ ByVal lpszRemoteName As String, _ cbRemoteName As Long) As Long Private Declare Sub CoTaskMemFree Lib "ole32" (ByVal pv As Long) ' BROWSEINFO構造体 Private Type BROWSEINFO hwndOwner As Long pidlRoot As Long pszDisplayName As String lpszTitle As String ulFlags As Integer lpfn As Long lParam As Long iImage As Integer End Type Private Const CSIDL_DESKTOP = &H0 'デスクトップ Private Const BIF_RETURNONLYFSDIRS = &H1 'フォルダのみ Private Const MAX_PATH = 260 '----------------------------------------------------------------- ' @Description: フォルダ選択ダイアログ表示(右に\マークをつけてフォルダパスを返す) ' @Param : [strCaption] 省略可能 ダイアログに表示する文字列 ' @Param : [ConvertUNC] 省略可能 ネットワークドライブ名を UNC に変換 ' @Return : String '----------------------------------------------------------------- Public Function BrowseForFolder( _ Optional strCaption As String = "フォルダを指定して下さい", _ Optional blnConvUNC As Boolean = False) As String Dim udtBrowserInfo As BROWSEINFO Dim lngRet As Long Dim strPath As String With udtBrowserInfo .ulFlags = BIF_RETURNONLYFSDIRS .lpszTitle = strCaption .pidlRoot = CSIDL_DESKTOP End With lngRet = SHBrowseForFolder(udtBrowserInfo) If lngRet > 0 Then strPath = String$(MAX_PATH, vbNullChar) Call SHGetPathFromIDList(lngRet, strPath) Call CoTaskMemFree(lngRet) strPath = Left$(strPath, InStr(strPath, vbNullChar) - 1) If Right$(strPath, 1) <> "\" Then strPath = strPath & "\" End If If blnConvUNC Then Call ConvUNC(strPath) BrowseForFolder = strPath Else BrowseForFolder = vbNullString End If End Function ' ネットワークドライブ名を含むパスを UNC に変換する Private Sub ConvUNC(ByRef strPath As String) Dim strDRV As String Dim strBuf As String * MAX_PATH strDRV = Left$(strPath, 2) If strDRV Like "[A-Z]:" Then Call WNetGetConnection(strDRV, strBuf, MAX_PATH) If InStr(strBuf, vbNullChar) > 1 Then strPath = _ Left$(strBuf, InStr(1, strBuf, vbNullChar) - 1) _ & Mid$(strPath, 3) End If End If End Sub '■■■■■ 【 Module1 ここまで 】 ■■■■■■■■■■■■■■■■ '■■■■■ 【 Module2 にコピー&ペースト 】 ■■■■■■■■■■■ Option Explicit Sub フォルダ内全ブックの順次処理() Dim strFolderPath As String Dim strFoundFile As String Dim strMes As String Dim WB As Workbook '処理対象ファイル Const cnsTARGET_FILE As String = "*.xls" ' フォルダ選択ダイアログ表示 strFolderPath = BrowseForFolder(, True) ' 長さ0の文字列が返った場合はキャンセルとする If strFolderPath = vbNullString Then Exit Sub On Error GoTo ERROR_HANDLER ' フォルダ内のファイル検索 strFoundFile = Dir(strFolderPath & cnsTARGET_FILE) If strFoundFile = vbNullString Then MsgBox "指定された場所に対象ファイルはありません.", vbExclamation Exit Sub End If ' ファイルが見つからなくなるまでループ Do While strFoundFile <> vbNullString ' マクロが書かれたファイルは除外 If strFoundFile <> ThisWorkbook.Name Then 'ここで作成済みのマクロを呼び出す ------------------------ MsgBox strFoundFile '(EX) '--------------------------------------------------------- End If ' 再検索 strFoundFile = Dir() Loop TERMINATE: Exit Sub ERROR_HANDLER: Application.ScreenUpdating = True Select Case Err.Number Case Is = 52: strMes = "ドライブにアクセスできません." Case Else: strMes = Err.Description End Select MsgBox "Error(" & Err.Number & ")" & vbCrLf _ & strMes, vbCritical Resume TERMINATE End Sub '■■■■■ 【 Module2 ここまで 】 ■■■■■■■■■■■■■■■■
お礼
おかげさまで、実行、開くことができました。 大変恐れ入ります、どうも、有難うございました。 基本から順次勉強していきたいと思ってます。 私は、マクロの記録が少々できるぐらいですが、 1つだけ、お願いします。 フォルダ内のファイル.xlsを指定してきましたが、そこから進みませんが、このファイル.xlsにマクロを作成しておけば、OKボタンで実行されるのですか? それとも、 'ここで作成済みのマクロを呼び出す --------------- MsgBox strFoundFile '(EX) '------------------------------------------------ この点線間のどの部分に、自分の行いたいマクロコードを貼り付けるのですか? そしてOKボタンで実行されるわけですか? もしこの部分に貼り付けるとしたら、簡単なコードを「マクロの記録」で作成し、試しに実行してみようと思いますが、この場合の、記録スタート部分の操作だけが解りません。 お手数ですがよろしくお願い致します。
- Wendy02
- ベストアンサー率57% (3570/6232)
Wendy02です。 趣旨を理解してくださって、ありがとうございました。 >何かサンプル的コードで構いません でしたら、以下だけでも、サンプルコードとしては成り立っています。 MsgBox WB.Name '(EX) エラーが出る場合、どのようなエラーなのか、'1004 という番号が出るのか、それとも、他の番号なのか、ダイアログ・メッセージなのか、それを知りたいです。 コードが読めないとなると、もしかしたら、「標準モジュール」がお分かりにならないような気がします。 そのエラーの問題さえはっきりすれば、ある程度、マクロが分かる方ならアドバイスは可能かと思います。ただ、元のコードの改変は出来ませんね。 出来れば、段階的にVBAを学習していったほうがよいと思います。
お礼
度々、恐れ入ります。どうも有難うございます。 おかげさまで、NO.4様のコードで開くことができました。 未熟ですが、上記でサンプルのことを記載しておきました。
- akina_line
- ベストアンサー率34% (1124/3287)
こんにちは。 下記の手順で実行してください。 1.Excelを起動する。 2.メニューの[ツール]->[マクロ]->[Visual Basic Editor]を選択する。 3.別ウィンドゥでVBAのエディタが起動するので、その画面のメニューの[挿入]->[標準モジュール]を実行すると、「Module1」が挿入されます。 4.前回回答の「'■■■■■ 【 Module1 にコピー&ペースト 】 ■■■■■■■■■■■」から「'■■■■■ 【 Module1 ここまで 】 ■■■■■■■■■■■■■■■■」までを選択し、そこを右クリックして出るメニューの「コピー」を選びます。(特に最初の「'」を落とさないようにしてください。) 5.3で挿入した「Module1」の白地のところで右クリックして出るメニューから「貼り付け」を選ぶと、回答に記載されていたものが貼り付け(これをペーストと言います。)られます。 6.3の手順をもう一度行うと、「Module2」が挿入されます。 7.前回の回答の「'■■■■■ 【 Module2 にコピー&ペースト 】 ■■■■■■■■■■■」以降の部分を同様に「Module2」に貼り付けます。 8.[ツール]->[マクロ]を選ぶとウィンドの中に、「フォルダ内全ブックの順次処理」が出ると思いますので、右側の[実行]ボタンを押すと実行できます。 なお、Module1のルーチンはModule2のサブルーチンなので単独に実行はできません。 では。
お礼
ご詳細、どうもありがとうございました。 おかげさまで、No.4様のソースは何とか実行、開けました。
- trajaa
- ベストアンサー率22% (2662/11921)
当該質問見ました。 ん~。初心者の方にAPIを使わせるのは難しいのではと思います。 >ある操作を施して上書き保存するというマクロを作りました。 >VBAコードは読めません。 一見矛盾しているように見えますが、マクロの記録程度は出来るが、マクロコードの意味は理解していない。 と言ったレベルと言うことでしょうか? 今後、マクロを多用されますか? であれば、素直に参考書等を手に入れて、順序立てて学習された方が良さそうです。 今だけ、これだけ、動けば良いんだよと言う場合には。。。改めて回答します。
お礼
はい、マクロの記録が少々できるだけでございます。 おっしゃられるとおりです。 どうも有難うございました。
お礼
度々、どうも有難うございました。自身の学習にもっと時間を費やすことに心がけたいと思いました。またよろしくお願い致します。