• 締切済み

エクセルVBAで、任意指定のファイル名を取得する方法を

教えて下さい。 ファイル(エクセルブック)を数個開いています。そのうち基本となるファイル(便宜上基本ファイルとします)は常に開いていて、後の数個の作業ファイルを開きます。(作業ファイルはその都度入れ替わり固定のファイルではありません)  基本ファイルを、アクティブな状態でエクセルVBAマクロを走らせます。 そのマクロ実行中に、『ある作業ファイルの任意のセル(任意のセル)をクリックして、そのファイル名とシート名とセルのアドレスとそのセルの値を取得』して、基本ファイルの任意のセル(例えば基本ファイルのsheet1のセルA2~D2に)に記入したいのです。 分かりにくい文で申し訳ないですが、特に上の『 』内の部分です。 どのようにマクロを記述すればいいのか分からないので、教えて下さい。宜しくお願いします。

みんなの回答

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

あー・・案の定やっちまった(;´Д⊂) シート名が正しく記録されないですね。。 ワークシートのダブルクリックイベントの中で下記の部分を 差し替えます。   (誤)   ' // ダブルクリックされたセルの情報を記録   With mSh     lRow = .Cells(Rows.Count, "A").End(xlUp).Row + 1     .Cells(lRow, "A").Value = ActiveWorkbook.FullName     .Cells(lRow, "B").Value = ActiveSheet.Name     .Cells(lRow, "C").Value = ActiveCell.Address     .Cells(lRow, "D").Value = ActiveCell.Value   End With           ↓↓↓↓↓   (正)   ' // ダブルクリックされたセルの情報を記録   With mSh     lRow = .Cells(Rows.Count, "A").End(xlUp).Row + 1     .Cells(lRow, "A").Value = Sh.Parent.FullName     .Cells(lRow, "B").Value = Sh.Name     .Cells(lRow, "C").Value = Target.Address     .Cells(lRow, "D").Value = Target.Value   End With

banzaiA
質問者

お礼

感動しました! ありがとうございます。早速実行し、確認できました。 私が考えていた目的の結果も得られました。 参考にさせていただきます。

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

こんにちは。 基本ファイルの ThisWorkbook モジュールにコピペして下さい。 その後、ブックを保存してから開きなおすとツールバーが生成 されてます。 ツールバーの「セル情報の記録」ボタンをクリックした後、セルを 適当に DB クリックすると基本ファイルに記録します。 なお、基本ファイルのセルは記録しません。ほかブックのみです。 勢いで作ったのでテストは全然してませんが。 Option Explicit Private WithEvents xlApp  As Application Private WithEvents Cbb   As CommandBarButton Private mSh         As Worksheet ' // 作業用ツールバーの名前 Private Const TOOLBAR_NAME As String = "MyToolBar" ' // レコード記録シート名 Private Const RECSHEET_NAME As String = "Record" ' // ブックのオープンイベント Private Sub Workbook_Open()   Set xlApp = Application RETRY:   On Error GoTo ERR_NOEXIST_RECSHEET   Set mSh = ThisWorkbook.Worksheets(RECSHEET_NAME)   On Error GoTo 0   Call AddMyToolBar TERMINATE:   Exit Sub ERR_NOEXIST_RECSHEET:   With ThisWorkbook.Worksheets.Add(Before:=Sheets(1))     .Name = RECSHEET_NAME     .Range("A1:D1").Value = Array("Book", "Sheet", "Address", "Value")   End With   MsgBox "[ " & RECSHEET_NAME & " ] シートを作成しました。", _       vbInformation   Err.Clear   Resume RETRY End Sub ' // ブックのクローズイベント Private Sub Workbook_BeforeClose(Cancel As Boolean)   Set mSh = Nothing   Set xlApp = Nothing   Call DelMyToolBar End Sub ' // 作業用ツールバーの追加 Private Sub AddMyToolBar()   Dim Cmb As CommandBar   Call DelMyToolBar   Set Cmb = xlApp.CommandBars.Add(Name:=TOOLBAR_NAME, _                   Position:=msoBarTop, _                   Temporary:=True)   Set Cbb = Cmb.Controls.Add(Type:=msoControlButton)   With Cbb     .Caption = "セル情報の記録"     .Style = msoButtonIconAndCaption     .FaceId = 184   End With   Cmb.Visible = True   Set Cmb = Nothing End Sub ' // 作業用ツールバーの削除 Private Sub DelMyToolBar()   On Error Resume Next   Set Cbb = Nothing   xlApp.CommandBars(TOOLBAR_NAME).Delete   On Error GoTo 0 End Sub ' // 作業用ツールバーのボタンクリックイベント Private Sub Cbb_Click( _     ByVal Ctrl As Office.CommandBarButton, _     CancelDefault As Boolean _ )   With Cbb     '// ボタンの On/Off 状態を切り替え     .State = Not CBool(.State)     '// ボタンの On/Off 状態でアイコンを切り替え     If CBool(.State) Then       .FaceId = 228 ' // FaceID:228 ■マーク     Else       .FaceId = 184 ' // FaceID:184 ●マーク       xlApp.StatusBar = ""     End If   End With End Sub ' // ワークシートのダブルクリックイベント Private Sub xlApp_SheetBeforeDoubleClick( _     ByVal Sh As Object, _     ByVal Target As Range, _     Cancel As Boolean _ )   ' // 終了条件:: 作業用ツールバーのボタンが Off なら何もしない   If CBool(Cbb.State) = False Then Exit Sub   ' // 終了条件:: ThisWorkbook なら何もしない   If Sh.Parent Is ThisWorkbook Then Exit Sub      Dim lRow As Long   On Error GoTo ERR_HANDLER   ' // 編集モードを解除   Cancel = True   ' // ダブルクリックされたセルの情報を記録   With mSh     lRow = .Cells(Rows.Count, "A").End(xlUp).Row + 1     .Cells(lRow, "A").Value = ActiveWorkbook.FullName     .Cells(lRow, "B").Value = ActiveSheet.Name     .Cells(lRow, "C").Value = ActiveCell.Address     .Cells(lRow, "D").Value = ActiveCell.Value   End With   ' // 記録したことをユーザーに通知(ステータスバーで)   xlApp.StatusBar = "Record: " _           & ActiveWorkbook.Name & "/" _           & ActiveSheet.Name & "/" _           & ActiveCell.Address TERMINATE:   Exit Sub ERR_HANDLER:   MsgBox Err.Description, vbCritical   Resume TERMINATE End Sub

banzaiA
質問者

お礼

早速のご回答ありがとうございます。 勉強しながら、ご提示いただいたマクロを実行してみます。

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

こんにちは。 『ある作業ファイルの任意のセル(任意のセル)をクリックして、 --クリックして、というのは、事実上はできません。ショートカットあたりかな? セルは、通常の作業で[左]クリックも[右]クリックも作業としてありますから、[左]クリックは完全に使えないし、[右]クリックは、その機能をつぶさないとできません。 そのファイル名とシート名とセルのアドレスとそのセルの値を取得』 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ でも、この範囲だけですと、『リンク貼り付け』の機能だと思います。 それを、何かひとつの操作でしたいというのなら、記録マクロを加工して、ショートカットやツール・コマンドボタンなどにしてあげれば、出来上がるはずです。(ただし、Ctrl + C のショートカット・コピーに関しては、割り当てることは、一般的にはできません。)

banzaiA
質問者

お礼

早速のご回答ありがとうございます。