- 締切済み
VBAで他ワークブックとのやり取り
お世話になります。 VBAで、他のワークブックを開き、データを取得する場合 画面上にワークブックが開かなくても(メモリ上で開く!?)、 データを取得したり出来ると聞いたのですが、その記述方法 をお教え頂きたく宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- imogasi
- ベストアンサー率27% (4737/17069)
下記のようなやり方の一例があるが、こういうのは、質問者の意に沿うものかどうか? "Book7.xls"の部分は CurDirの既存ブックを質問者の場合に変えてください。 またはフルパス指定すること。 Application.Visible=Trueを入れると画面に出てしまう。 セルの値を取得でなく設定例だが同じと思う。 --- Sub test01() Set appexcel = CreateObject("Excel.Application") Application.DisplayAlerts = False Set bk = appexcel.Workbooks.Open(CurDir & "\" & "Book7.xls") bk.Sheets(1).Cells(1, "B") = "abc" bk.Sheets(1).Cells(1, "C") = 1234 bk.Sheets(1).Cells(1, "D") = "東京都" '--- bk.Save bk.Close Set bk = Nothing Application.DisplayAlerts = True Set appexcel = Nothing End Sub
- diashun
- ベストアンサー率38% (94/244)
Excel 4.0のマクロを使い、ブックを開かないでセルのデータを読み込むことができます。 ここでは、ブックの指定は「ファイルを開く」ダイアログボックスを使っています。シート名は インプットボックスで入力してもらいますが、入力されたワークシートの存在もチェックしています。 この例では対象ブックの「Sheet1」に「名前」という項目名がついたセル(フィールド)があり、その下方向に 友達やお得意先の氏名が記述されているものとします。 その対象ブックを開かずに「名前フィールド」のデータをアクティブブックのA列に読み込みます。 テストするには、上記のとおりのデータを持つブックを作成しておきます。 Public Sub Get_FieldData() Dim strF_Name As String, ShName As String Dim strTgt As String, buf As String Dim i As Long, strTgtCol As Long, GetNames() Application.ScreenUpdating = False Columns("A").Clear '対象ブックを指定 strF_Name = Application.GetstrF_Name("Microsoft Excel ブック,*.xls") If strF_Name = "False" Then Exit Sub ''ファイル名に[]を付ける strF_Name = Replace(strF_Name, Dir(strF_Name), "[" & Dir(strF_Name) & "]") Debug.Print strF_Name ''対象シート名を入力 ShName = InputBox("読み込むワークシート名を入力してください。", "ExcelFile", "Sheet1") If ShName = "" Then Exit Sub strTgt = "'" & strF_Name & ShName & "'!" Debug.Print strTgt ''ワークシート名を確認 On Error Resume Next buf = ExecuteExcel4Macro(strTgt & "R1C1") If Err <> 0 Then MsgBox "シート 「 " & ShName & " 」 を読み込めません。", vbCritical Exit Sub End If On Error GoTo 0 '「名前」フィールドを取得 For i = 1 To 256 If ExecuteExcel4Macro(strTgt & "R1C" & i) = "名前" Then strTgtCol = i Exit For End If Next i If strTgtCol = 0 Then MsgBox "「 名前」フィールドがありません。", vbCritical Exit Sub End If '名前データの取得(ここでは最大取得データ数を 1,000 としていますが、データがあるだけ取得するには、 '少し工夫が必要です) For i = 2 To 1000 buf = ExecuteExcel4Macro(strTgt & "R" & i & "C" & strTgtCol) If buf = "0" Then Exit For '「アクティブシート」に出力 ActiveSheet.Cells(i - 1 + 45, 1) = buf Next i Application.ScreenUpdating = True End Sub 最後になりましたが、ご使用PCの環境やOS、Excelのバージョンなどもご質問時に添えていただくほうが望ましいと思います。 ちなみに、上記ソースはExcel2003、2007で動作可能です。
- soixante
- ベストアンサー率32% (401/1245)
ご意向に沿ってるかわかりませんが、私は以下を参照にしてやってみたことがあります。 http://officetanaka.net/excel/vba/file/file05.htm