人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【エクセルのマクロ】
エクセルのマクロで、ブックAの特定の場所に、開いていない別のブックBの一番目のシートの全てのデータをコピーして貼り付けたいのですが、どうしたらいいでしょうか?ブックBのデータの長さは可変です。

●質問者: abura-uribou
●カテゴリ:コンピュータ
✍キーワード:エクセル コピー データ マクロ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● lowstar
●35ポイント

えっと、シートをコピーする際にブックBを一時的に開いてコピーするのなら簡単にできますよ。

サンプルコードを書いておきますので、試してみてくださいな。

Sub Macro1()

Dim sheetB As String

'ブックBをダイアログを開いて選択する場合の処理

'(シートBのファイル名が固定の場合は、変数sheetBにファイルの参照先を設定してください。)

sheetB = Application.GetOpenFilename()

If sheetB = False Then Exit Sub

With ActiveSheet

'シートBを開く処理

Workbooks.Open Filename:=sheetB

'貼り付け処理

Range("貼り付け元の範囲").Copy Destination:=.Range("貼り付け先のセル")

'シートBを閉じる処理

Application.DisplayAlerts = False '変更を保存しますか?の警告を無視する。

Workbooks(logBookName).Close

Application.DisplayAlerts = True

End With

End Sub

このようなコードで、シートBを一時的に開いてシートAの特定の場所にデータをコピーできると思います。

シートBのデータが長さは可変ということでしたが、その範囲を求めるにはシートBのデータの並びに一定の決まりがないと、コードが書けないです。

例えば、シートBのデータがA1から始まっていて、下の行に可変長のデータがつながっているのなら、

貼り付け元の範囲 = range(range("A1"),range("A1").End(xlDown))

とすることで、A1行から下につながったデータの範囲を取得することができます。

列も可変の場合には、

貼り付け元の範囲 = range(range("A1"),range("A1").End(xlDown).End(xlToRight))

とすることで、範囲が取得できると思います。

あいまいな説明で申し訳ありませんが、頑張ってくださいっ!

◎質問者からの返答

コピーする際にできればブックBを閉じたまま作業したいと考えておりました。

説明不足で申し訳ございません。

範囲の取得についてはとても勉強になりました。

ありがとうございます。


2 ● SALINGER
●100ポイント ベストアンサー

こんな感じでしょうか。

BブックのA列に空白があった場合を考慮すると多少わかりづらいコードとなりました。

普通にExecuteExcel4Macroで参照すると空白は"0"が返り、実際に0が入力されていた場合に区別できないので、

参照先の文字数で空白かどうかを判断しています。


実際のブックのアドレスに変更して実行してみてください。

Sub Macro()
 Const strPath As String = "C:\Documents and Settings\hogehoge\デスクトップ"
 Dim r As Long
 Dim strLen As String
 r = 1
 Do
 strLen = Application.ExecuteExcel4Macro("LEN('" & strPath & "\[Bブック.xls]Sheet1'!R" & r & "C2)")
 If strLen > 0 Then
 If Application.ExecuteExcel4Macro("LEN('" & strPath & "\[Bブック.xls]Sheet1'!R" & r & "C1)") > 0 Then
 Worksheets(1).Cells(r + 9, 2).Value = _
 Application.ExecuteExcel4Macro("'" & strPath & "\[Bブック.xls]Sheet1'!R" & r & "C1")
 Else
 Worksheets(1).Cells(r + 9, 2).Value = ""
 End If
 Worksheets(1).Cells(r + 9, 3).Value = _
 Application.ExecuteExcel4Macro("'" & strPath & "\[Bブック.xls]Sheet1'!R" & r & "C2")
 r = r + 1
 Else
 Exit Do
 End If
 Loop
End Sub
◎質問者からの返答

実際にこのコードを試してみたところ、思い描いていた通りの動きを実現することができました。

ありがとうございます。

しかし、こちらのミスで質問文に『ブックBのデータが数値であっても文字列として受け取りたい』と記載するのを忘れておりました・・・

もしよろしければ、そのあたりも教えていただけると幸いです。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ