みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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

教えて下さい。
ファイル(エクセルブック)を数個開いています。そのうち基本となるファイル(便宜上基本ファイルとします)は常に開いていて、後の数個の作業ファイルを開きます。(作業ファイルはその都度入れ替わり固定のファイルではありません) 

基本ファイルを、アクティブな状態でエクセルVBAマクロを走らせます。
そのマクロ実行中に、『ある作業ファイルの任意のセル(任意のセル)をクリックして、そのファイル名とシート名とセルのアドレスとそのセルの値を取得』して、基本ファイルの任意のセル(例えば基本ファイルのsheet1のセルA2~D2に)に記入したいのです。

分かりにくい文で申し訳ないですが、特に上の『 』内の部分です。
どのようにマクロを記述すればいいのか分からないので、教えて下さい。宜しくお願いします。

投稿日時 - 2007-05-27 09:08:34

QNo.3033984

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.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

投稿日時 - 2007-05-27 12:20:36

お礼

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

投稿日時 - 2007-05-27 18:04:17

ANo.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

投稿日時 - 2007-05-27 12:09:41

お礼

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

投稿日時 - 2007-05-27 17:40:30

ANo.1

こんにちは。

『ある作業ファイルの任意のセル(任意のセル)をクリックして、

--クリックして、というのは、事実上はできません。ショートカットあたりかな?
セルは、通常の作業で[左]クリックも[右]クリックも作業としてありますから、[左]クリックは完全に使えないし、[右]クリックは、その機能をつぶさないとできません。

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

投稿日時 - 2007-05-27 11:17:06

お礼

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

投稿日時 - 2007-05-27 17:38:50

あなたにオススメの質問