• ベストアンサー

このマクロを実行し、表示させるにはどうしたらよいですか?

恐れ入ります。初心者です。WinXP、Excel 2002を使用。VBAコードは読めません。 「本gooのカテゴリ」について、まだ把握してなく、別カテゴリで同質問してしまい、その回答者様に当「Office系ソフトのカテゴリ」へとご指示されました。 質問がダブってしまいましたが、よろしくお願い致します。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1432630 のページ の回答者No.2様のマクロを実行し、表示させるにはどうしたらよいですか? このままコピーしましたが、実行できませんでした。 私のやり方(解釈)が間違っていたのだと解りました。 別のコードを追加しないと、実行できないのでしたら、何かサンプル的コードで構いませんので、 このマクロを実行し表示させる方法が、おありでしたら教えてくださいませ。 1、コピー&ペーストから、詳しく教えて下さいませ。 2、Module1とModule2を個々のマクロで実行し、表示する方法も併せて教えて下さいませ。

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.9

書き方が悪かったですね。#8 の「サブルーチンには、~」以降は何故エラー になるのかの解説です。Workbooks.Open ~の部分は変更する必要はありませ ん。#8 での修正は次の部分だけです。 <修正前>   ' ここで作成済みのマクロを呼び出す -----------------------   Call テスト(strFoundFile) '<--- 修正(ご自分のマクロ呼び出し)   '--------------------------------------------------------- <修正後>   'ここで作成済みのマクロを呼び出す ------------------------   Call テスト(strFolderPath & strFoundFile)   '--------------------------------------------------------- まずは、この部分だけ直して実行してみて下さい。それで、うまくいくと 思います。疑問があれば、再度補足して下さい。

oshietecho-dai
質問者

お礼

度々、どうも有難うございました。自身の学習にもっと時間を費やすことに心がけたいと思いました。またよろしくお願い致します。

その他の回答 (8)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.8

> フォルダの参照→OK→「Error(1004)、 > …xls`が見つかりません。ファイルおよびファイルの保存場所が正しいか > どうか確認してください。…。」となりました このような情報をいただけると非常に助かります。ありがとうございます^^ 原因は、完全に私のミスですね。すみません。   'ここで作成済みのマクロを呼び出す ------------------------   Call テスト(strFolderPath & strFoundFile)   '--------------------------------------------------------- このように直してみて下さい。サブルーチンには、   「フォルダのパス」=ファイルの場所 を含めた情報を渡さなければなりませんでした。 × Workbooks.Open Filename:="test.xls"   ファイル名は分かるが、どこにあるファイルなのか分からない   -->ブックを開くことができず、1004番のエラー発生 ○ Workbooks.Open Filename:="C:\test.xls"   ファイルの場所、ファイル名ともに分かるのでブックを開くことが可 どうでしょうか?

oshietecho-dai
質問者

補足

大変恐れいります。 また、同じ→「Error(1004)、…」となりました。 ご確認ですが、 ' ブックを開く ---> 開かれたブックがアクティブになる Workbooks.Open Filename:=strFilename ↓を ' ブックを開く ---> 開かれたブックがアクティブになる Workbooks.Open Filename:="C:\test.xls" でよろしいでしょうか? 私の場合、今度は、Cドライブに「新しいフォルダ」として置いてみましたが、 Workbooks.Open Filename:="C:\*.xls"   (しかし、これも、同じエラーでした) としなくてもよいのですね。 よろしくお願い致します。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.7

> ...下記のようにそのまま貼り付けてしまってよろしいでしょうか? 私が提示したサンプルを実行するなら、その通りです。それから、   ' ここで作成済みのマクロを呼び出す -----------------------   MsgBox strFoundFile '(EX)   '---------------------------------------------------------   ↓   ' ここで作成済みのマクロを呼び出す -----------------------   Call テスト(strFoundFile) '<--- 修正(ご自分のマクロ呼び出し)   '--------------------------------------------------------- も修正して下さい。 回答をよくお読みいただければ、その様に書いてあるはずです。私が回答 するときは専門用語は必要最小限しか使わず、なるべくご質問者様の立場 に立った回答になるように気をつけています。また、一度係わった以上は 私の回答なり、他の方の回答で、それなりの解決に至るまでは何度でも サポート致します。 もちろんそれが不十分であったり、ご質問の意図を外してトンチンカンな 回答をしてしまう場面も多々ありますが、少なくとも今回補足頂いた内容 は、   「聞く前に試してみる」 というのが抜けていると言うか、何と言うのでしょう、初心者とかの次元の 話では無い所に問題がある気がするのです。   「こうやってみたけど、うまくいかなかった。なぜか?」 という補足を頂けたら嬉しかったのですが....試してみればわかることで すよね。

oshietecho-dai
質問者

補足

はい、2箇所修正して実行して見ましたが、フォルダの参照→OK→「Error(1004)、 `…xls`が見つかりません。ファイルおよびファイルの保存場所が正しいかどうか確認してください。…。」となりました。 但し、修正前は、 フォルダの参照→OK→Microsoft Excel→OK、OKで終了しました。 ちなみに、デスクトップにフォルダを作り、xlsファイルを2つ入れてあります。 以上よろしくお願い致します。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.6

▼ ご自分で作成されたマクロの修正 > そのマクロを走らせるとファイル名を聞いてきまして、そこでファイル名を > 入力してやれば、ある操作を施したあと自動的に上書き保存までしてくれる と前回のご質問にあります。例えば、こんな感じのマクロだとしましょう。 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) '<--- 修正(ご自分のマクロ呼び出し)   '--------------------------------------------------------- このような感じですが、よく意味が分からなければ、ご自分で作成された コードを補足して下さい。

oshietecho-dai
質問者

補足

ご回答誠に有難うございます。 大変申し訳ありませんが、下記のようにそのまま貼り付けてしまってよろしいでしょうか? >▼ この修正されたマクロを、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)
回答No.5

Office2003(たぶんXPも)だったら、 FileDialog が使えて、 フォルダの取得が簡単にできるんですけどね。 Accessユーザーにとっては、 ファイル名を取得できるだけでも大変な進歩です。

oshietecho-dai
質問者

お礼

そうなんですね、どうも有難うございます。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

何気にクリックしたら私が前に書いたコードだったのでビックリしました^^; どうも混乱させてしまった様で、すみませんでした。 記述の方法は、他の回答者様がご説明下さいましたので省略しますが、前回書 いたコードにはバグがあって、、ルートフォルダを選択すると¥記号が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 ここまで 】 ■■■■■■■■■■■■■■■■

oshietecho-dai
質問者

お礼

おかげさまで、実行、開くことができました。 大変恐れ入ります、どうも、有難うございました。 基本から順次勉強していきたいと思ってます。 私は、マクロの記録が少々できるぐらいですが、 1つだけ、お願いします。 フォルダ内のファイル.xlsを指定してきましたが、そこから進みませんが、このファイル.xlsにマクロを作成しておけば、OKボタンで実行されるのですか? それとも、 'ここで作成済みのマクロを呼び出す ---------------             MsgBox strFoundFile '(EX) '------------------------------------------------ この点線間のどの部分に、自分の行いたいマクロコードを貼り付けるのですか? そしてOKボタンで実行されるわけですか? もしこの部分に貼り付けるとしたら、簡単なコードを「マクロの記録」で作成し、試しに実行してみようと思いますが、この場合の、記録スタート部分の操作だけが解りません。 お手数ですがよろしくお願い致します。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

Wendy02です。 趣旨を理解してくださって、ありがとうございました。 >何かサンプル的コードで構いません でしたら、以下だけでも、サンプルコードとしては成り立っています。 MsgBox WB.Name '(EX) エラーが出る場合、どのようなエラーなのか、'1004 という番号が出るのか、それとも、他の番号なのか、ダイアログ・メッセージなのか、それを知りたいです。 コードが読めないとなると、もしかしたら、「標準モジュール」がお分かりにならないような気がします。 そのエラーの問題さえはっきりすれば、ある程度、マクロが分かる方ならアドバイスは可能かと思います。ただ、元のコードの改変は出来ませんね。 出来れば、段階的にVBAを学習していったほうがよいと思います。

oshietecho-dai
質問者

お礼

度々、恐れ入ります。どうも有難うございます。 おかげさまで、NO.4様のコードで開くことができました。 未熟ですが、上記でサンプルのことを記載しておきました。

  • akina_line
  • ベストアンサー率34% (1124/3287)
回答No.2

こんにちは。  下記の手順で実行してください。   1.Excelを起動する。   2.メニューの[ツール]->[マクロ]->[Visual Basic Editor]を選択する。   3.別ウィンドゥでVBAのエディタが起動するので、その画面のメニューの[挿入]->[標準モジュール]を実行すると、「Module1」が挿入されます。   4.前回回答の「'■■■■■ 【 Module1 にコピー&ペースト 】 ■■■■■■■■■■■」から「'■■■■■ 【 Module1 ここまで 】 ■■■■■■■■■■■■■■■■」までを選択し、そこを右クリックして出るメニューの「コピー」を選びます。(特に最初の「'」を落とさないようにしてください。)   5.3で挿入した「Module1」の白地のところで右クリックして出るメニューから「貼り付け」を選ぶと、回答に記載されていたものが貼り付け(これをペーストと言います。)られます。   6.3の手順をもう一度行うと、「Module2」が挿入されます。   7.前回の回答の「'■■■■■ 【 Module2 にコピー&ペースト 】 ■■■■■■■■■■■」以降の部分を同様に「Module2」に貼り付けます。   8.[ツール]->[マクロ]を選ぶとウィンドの中に、「フォルダ内全ブックの順次処理」が出ると思いますので、右側の[実行]ボタンを押すと実行できます。  なお、Module1のルーチンはModule2のサブルーチンなので単独に実行はできません。 では。

oshietecho-dai
質問者

お礼

ご詳細、どうもありがとうございました。 おかげさまで、No.4様のソースは何とか実行、開けました。

  • trajaa
  • ベストアンサー率22% (2662/11921)
回答No.1

当該質問見ました。 ん~。初心者の方にAPIを使わせるのは難しいのではと思います。 >ある操作を施して上書き保存するというマクロを作りました。 >VBAコードは読めません。 一見矛盾しているように見えますが、マクロの記録程度は出来るが、マクロコードの意味は理解していない。 と言ったレベルと言うことでしょうか? 今後、マクロを多用されますか? であれば、素直に参考書等を手に入れて、順序立てて学習された方が良さそうです。 今だけ、これだけ、動けば良いんだよと言う場合には。。。改めて回答します。

oshietecho-dai
質問者

お礼

はい、マクロの記録が少々できるだけでございます。 おっしゃられるとおりです。 どうも有難うございました。

関連するQ&A