【エクセルのマクロ】

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

回答の条件
  • 1人2回まで
  • 登録:2009/06/14 15:04:24
  • 終了:2009/06/14 21:00:06

ベストアンサー

id:SALINGER No.2

SALINGER回答回数3454ベストアンサー獲得回数9692009/06/14 19:45:40

ポイント100pt

こんな感じでしょうか。

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
id:abura-uribou

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

ありがとうございます。

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

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

2009/06/14 20:30:57

その他の回答(1件)

id:lowstar No.1

lowstar回答回数11ベストアンサー獲得回数12009/06/14 19:28:51

ポイント35pt

えっと、シートをコピーする際にブック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))

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

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

id:abura-uribou

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

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

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

ありがとうございます。

2009/06/14 20:24:20
id:SALINGER No.2

SALINGER回答回数3454ベストアンサー獲得回数9692009/06/14 19:45:40ここでベストアンサー

ポイント100pt

こんな感じでしょうか。

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
id:abura-uribou

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

ありがとうございます。

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

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

2009/06/14 20:30:57
  • id:Mook
    処理をする前の段階では開いていなくとも、処理中に開くことは問題ないのでしょうか。
  • id:abura-uribou
    できれば開かないまま処理をすることを考えております。
  • id:Mook
    Aブック、Bブックのシートはどちらも先頭シートが対象でよいのですか。

    Aブックの「特定の場所」とはどのセルなのでしょうか。
    Bブックのデータの長さは不定とありますが、データ範囲はどの列になっているのでしょうか。

    例えば、
     Aブックの先頭シートのC30に、Bブックの先頭シートの B列のデータを貼り付ける。
     BブックのB列はデータが連続していて、空白があれば終了。

    というように、仕様をもう少し明確にできれば、コードも作成できるかと思います。

  • id:SALINGER
    コピーする範囲が決まっていて、それが値だけならExecuteExcel4Macroで可能ですね。
  • id:abura-uribou
    Mook様
    対象はどちらも先頭のシートです。
    Aブックの特定の場所というのは、説明が少しややこしいでの
    B10から始まる範囲としていただいて構いません。
    Bブックのデータ範囲はA列、B列のみです。

    まとめますと
     Aブックの先頭シートのB10から始まる範囲に、Bブックの先頭シートの A列、B列のデータを貼り付ける。
     BブックのB列はデータが連続していて、空白があれば終了。


    となります。よろしくお願いいたします。

    SALINGER様
    情報ありがとうございます。
    コピーする範囲は決まっていないのですが、応用が利くかもしれないのでExecuteExcel4Macroについて調べてみたいとおもいます。

  • id:Mook
    回答が出たようなので、あとはお任せします。
  • id:SALINGER
    セルに表示する段階で、Excelの機能で数字だと数値として処理されるので
    コード中の
    >>
    If strLen > 0 Then
    <<
    の次に
    >>
    Worksheets(1).Cells(r + 9, 2).NumberFormatLocal = "@"
    Worksheets(1).Cells(r + 9, 3).NumberFormatLocal = "@"
    <<
    を入れてセルの表示形式を文字列にしてしまえばいいかな。
  • id:abura-uribou
    Mook様
    お付き合いしていただきありがとうございました。
    これから何かと質問させていただくこともあるかと思いますので、またよろしくお願いいたします。

    SALINGER様
    お早いお返事ありがとうございました。
    教えていただいたコードを加えてみたところ、文字列として受け取ることができました。
    本当にありごとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません