[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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 >
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
頂いた内容を熟読し、にわか脱出に少しでも近づけるよう勉強します。
ご教授ありがとうございました。
(DOM) 2019/01/11(金) 17:18
また、
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
が、読んで疑問に感じました。
引数に使われる変数は任意のものですし、予約語でもないと思いますし、
提示のコードはプロシージャ内のローカル変数ですし、正直何故?と思います。
個人的には、アドインのプロシージャに多用していますし、もし問題があるのなら、修正も考えねばなりません。
私は予約語である語でも、以下のような場合は
Public Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type 平気で使っているので気になりました。
問題があるんですか?(私は、ないという認識です)
(チオチモリン) 2019/01/11(金) 20:45
>正しくは、「Book2.xlsx」という名前のブックが【無かったら】ブックを開くではないですか?
お恥ずかしいです。知ったかぶって記述してました、おっしゃる通りです。
省略可能の有無等も判断つかなかった為、非常に勉強になりました!
頂いた内容、単なる丸写しではなく、1単語ずつ読み解き、習得出来るよう励みます!
(DOM) 2019/01/12(土) 10:11
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.