[[20190111145850]] 『VBA 別Bookからのコピペ』(DOM) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA 別Bookからのコピペ』(DOM)

以下はbook1で処理を実行する事でBook2を開き、C12:Q12にある値をbook1のシート名「SPEC」のD10から行列を入れ替えて、値のみで貼り付けてから、Book2を閉じるよう、記述したつもりですが、にわか知識の為、問題が特定できず困っています。解消方法等、ご教授頂けたら幸いです。

1.「実行時エラー1004 RangeクラスのSelectメソッドが失敗しました。」と表示されてしまいます。これを解消したいです。

2.Const Target As String = "C:\Users\WIN\Desktop\Book2.xlsx"の記述を「a & "\Book2.xlsx"」のように変数との組み合わせて省略する事は可能でしょうか?

3.後学の為、ここをこうした方が良い等のソースのアドバイスございましたらお願いしたいです。

―――――――――――――――――――――――――――――――
Sub sample()
Dim buf As String, wb As Workbook

    Const Target As String = "C:\Users\WIN\Desktop\Book2.xlsx"
    buf = Dir(Target)
    If buf = "" Then
        MsgBox Target & vbCrLf & "は存在しません", vbExclamation
        Exit Sub
    End If
    For Each wb In Workbooks
        If wb.Name = buf Then
            MsgBox buf & vbCrLf & "はすでに開いています", vbExclamation
            Exit Sub
        End If
    Next wb
    Workbooks.Open Target
    Windows("Book1.xlsm").Activate
    Sheets("SPEC").Select
    Windows("Book2.xlsx").Activate
    Range("C12:Q12").Select
    Selection.copy
    Windows("Book1.xlsm").Activate
    Range("D10").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=True
    Workbooks("Book2.xlsx").Close SaveChanges:=False
MsgBox "データ反映完了"
End Sub

―――――――――――――――――――――――――――――――

Excel2010 使用OS:WIN10

< 使用 Excel:unknown、使用 OS:unknown >


ブック→シート→セル の関係ですが、ブックとセルだけ指定しているから、シートが思ったものではないものが使われてエラーになっているのでは?
SelectとかActivateを使わずに、オブジェクトの親子関係が明確になるようなコーディングにすべきでしょう。

2番目の話は、何をしたいのか判りません。 1つの文字列定数を2つの文字列に分けて、& で連結して使うのは勿論可能ですが、それがどう役に立つのでしょう?

そして考え方ですが、Target という変数名は、Excel VBAで意味のある変数に使われているので、ユーザーが勝手に使うべきではありません。 そして、定数宣言するくらいですから、そのファイルの存在確認なんてする必要は無いのではないですか? 必ずあるファイルだから定数にしているのですよね? 更には、既に開いていたらエラー終了するくらいなら、その判定自体無くても、マクロがエラー停止するだけで、大して問題にはならないように思います。 そう考えると、前半半分のコードは不要に見えます。

Book2は無駄なくらい厳重にチェックしているのに、Book1はノーチェックというのも、バランスが悪いです。 それとも、Book1はマクロを動かす自ブックなのでしょうか? 自ブックが対象なら、Book2を開いてWorkBook変数に入れ、その中の.Sheets("シート名は何?").Range("C12:Q12") をコピーして自ブックの.Sheets("SPEC").Range("D10")に貼る、まで、3行前後で終わる事でしょう。
(???) 2019/01/11(金) 16:02


>2番目の話は、何をしたいのか判りません。 1つの文字列定数を2つの文字列に分けて、& で連結して使うのは勿論可能ですが、それがどう役に立つのでしょう?
他者のパソコンでも利用する際、パスの編集を必要としない柔軟なものに出来ないかと思い、ご質問させて頂きました。言葉足らずで大変申し訳ございませんでした。

頂いた内容を熟読し、にわか脱出に少しでも近づけるよう勉強します。

ご教授ありがとうございました。

(DOM) 2019/01/11(金) 17:18


???さんのコメントかなり被りますけど、おそらくマクロの記録を使つかったらそのようになっていたので、必ず、SelectとかActivateとか書く必要があるとおもってしまったんでしょうけど、そもそも要らないです。

また、

    For Each wb In Workbooks
        If wb.Name = buf Then
            MsgBox buf & vbCrLf & "はすでに開いています", vbExclamation
            Exit Sub
        End If
    Next wb

の部分で、開いているブックのなかに「Book2.xlsx」という名前のブックがあったら、プログラム終了となってますが、これ間違いで、正しくは、「Book2.xlsx」という名前のブックが【無かったら】ブックを開くではないですか?

(もこな2) 2019/01/11(金) 18:43


↑のつづき。

質問の「1」の方は具体的にどの場所でエラーになるのか提示頂くと、アドバイスできるところがあるかもしれませんが、現状のコードをぱっと見る限りエラーにはならないような気がします。

とりあえず、コメント付けながら直すとこんな感じでしょうか
(未テストなのでミスっていたらごめんなさい)

   Sub さんぷる()
      Dim MyFolder As String, ブック名 As String
      Dim srcWB As Workbook
      Dim フラグ As Boolean

      MyFolder = "C:\Users\WIN\Desktop\"
      ブック名 = "Book2.xlsx"

      '"Book2.xlsx"の存在チェック
      If Dir(MyFolder & ブック名) = "" Then
         MsgBox ブック名 & "が存在しません" & vbCrLf & "プログラムを終了します"
      End If

      '変数「srcWB」に"Book2.xlsx"をセット
      On Error Resume Next
         Set srcWB = Workbooks(ブック名)
      On Error GoTo 0
      If srcWB Is Nothing Then
         Set srcWB = Workbooks.Open(MyFolder & ブック名)
         フラグ = True
      End If

      '「Book2.xlsx」の「1シート目」の「Book1.xlsm」の「C12:Q12」セルをコピー
      srcWB.Workbooks(1).Range("C12:Q12").Copy

      '「Book1.xlsm」の「SPEC」シートの「D10」セルを起点としたセル範囲へ「値のみ」「行列入れ替え」で貼付
      Workbooks("Book1.xlsm").Worksheets("SPEC").Range("D10").PasteSpecial Paste:=xlPasteValues, Transpose:=True

      '確認メッセージを出さずに「Book2.xlsx」を閉じる ←元から開いていたときはそのまま(閉じない)
      If フラグ Then srcWB.Close SaveChanges:=False

      MsgBox "データ反映完了"
   End Sub

(もこな2) 2019/01/11(金) 19:33


本論でないコメントで申し訳ありませんが、
>Target という変数名は、Excel VBAで意味のある変数に使われているので、ユーザーが勝手に使うべきではありません。
上記は、質問された方へのアドバイスと考えます。

が、読んで疑問に感じました。
引数に使われる変数は任意のものですし、予約語でもないと思いますし、
提示のコードはプロシージャ内のローカル変数ですし、正直何故?と思います。

個人的には、アドインのプロシージャに多用していますし、もし問題があるのなら、修正も考えねばなりません。

私は予約語である語でも、以下のような場合は

 Public Type RECT
     Left As Long
     Top As Long
     Right As Long
     Bottom As Long
 End Type
平気で使っているので気になりました。

問題があるんですか?(私は、ないという認識です)

(チオチモリン) 2019/01/11(金) 20:45


もこな2様、ご教授、ありがとうございます。

>正しくは、「Book2.xlsx」という名前のブックが【無かったら】ブックを開くではないですか?
お恥ずかしいです。知ったかぶって記述してました、おっしゃる通りです。

省略可能の有無等も判断つかなかった為、非常に勉強になりました!

頂いた内容、単なる丸写しではなく、1単語ずつ読み解き、習得出来るよう励みます!

(DOM) 2019/01/12(土) 10:11


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.