EXCEL マクロ VBAについて質問をお願い致します。
フォルダ内の全てのブックを開いて、
sheet名が「商品A」だったら処理①を行う
sheet名が「商品B」だったら処理②を行う
というコードについて下記で試したところ上手く行きませんでした。
For Each ws In Worksheets
If ws.Name = "商品A" Then
ws.Range(Cells(3 , 2),Cells(20 , 2)).Copy wb.Worksheets (mysht).Cells(lastrow , 3) ’処理①
lastrow = lastrow + 18
End If
If ws.Name = "商品B" Then
ws.Range(Cells(3 , 2),Cells(20 , 2)).Copy wb.Worksheets (mysht).Cells(lastrow , 5) ’処理②
lastrow = lastrow + 18
End If
Next ws
どなたかご教授頂けますでしょうか。宜しくお願い致します。
No.3ベストアンサー
- 回答日時:
こんにちは
初めてのご質問のようですのでお節介なアドバイスをします
(うざったいかも知れませんが・・・)
ご質問の内容でおそらく問題がある場所は、すでに回答にある通りと思います
2シート以上存在するブックに対してアクティブでないシートにTrue処理をするとエラー1004が返り止まります)
しかし、
上手く行きませんでした。を広く解釈して想像するとエラーの出ないバグ(期待不一致処理)の可能性も見受けられます
>試したところ上手く行きませんでした。
この部分は、出来るだけ具体的にどのように上手くいかないのか
期待する処理結果との差異、エラーなどを記す様にしましょう
余談
バグの可能性
ご質問文をそのまま読むと・・
>フォルダ内の全てのブックを開いて
すべてを手動、もしくはVBAで開いたのちに処理した場合、対象となるブックは最後にアクティブになったブックとなります
each bk in workbooks などで取得するにしても
In Worksheetsを使う場合ブックオブジェクトを明示する必要があります
もちろん activateやselectで対応することは出来ますが・・
(1つずつ開いてそのまま処理していれば良いのですが)
他の部分でも期待と不一致処理を想像させる部分があります
lastrow = lastrow + 18
lastrowは変数名などから想像して最終行№を代入していると想像できますが
例えば、
lastrow = wb.Worksheets(mysht).Cells(Rows.Count, 3).End(xlUp).Row
又は lastrow = 定数
前者はwb.Worksheets(mysht)C列の最終行(新規行)を取得していますが
処理後に処理行数を+ 18しています。仮定として次のシート商品Bがあった時に貼り付けスタート行は最終行(新規行)では無い可能性が高いですよね
これもブックごとに行を同じにしたい場合、またはNot や 常に上から詰めて取得する場合、変数への値の代入方法(定数を代入)などで変わってきます・・
どうでしょう、良く解らない(求めていない)回答がされてしまいますよね
またそこで躓いたり、混乱したりするかもしれませんね
出来るだけ上手くいかない内容、事象を明示するようにするのが好ましいですね
Qchan1962様
こんばんは。ご回答頂きありがとうございます。
凄いです・・・まさに仰る通りで、lastrowの部分が期待した処理にならない最大の原因でした。
最終行(新規行)に値を次々取得していきたかったのですが、1つ目のIf文と2つ目のIf文の両方にlastrow = lastrow + 18を書いていたために、コピー先のC列とE列にそれぞれ18行飛ばしで値がコピーされていました。
ご指摘頂いたCellsにwsを指定し、1つ目のIf 文のlastrow = lastrow + 18を削除したところ思い通りの処理が出来ました。
今後質問する時には、どういう結果にしたかったか・エラーの内容等を細かく記載したいと思いました。
お節介どころか一番の原因を突き止めて頂き、本当に助かりました。ありがとうございました!
No.2
- 回答日時:
こんばんは
原因はNo1様の回答にある通りかと。
どちらも固定セル範囲なので、
>ws.Range(Cells(3 , 2),Cells(20 , 2)).Copy ~~
↓ ↓
ws.Range("B3:B20").Copy ~~
のような記述法にしておけば、あまり気にしなくてもすむと思います。
あるいは、
ws.Cells(3, 2).Resize(18).Copy ~~
とかでもいけるでしょう。
fujillin様
こんばんは。ご回答頂きありがとうございます。
なるほど、ws.Range("B3:B20").Copy ~~の書き方は可読性が高くとても分かりやすいですね。早速書き換えました。Resizeという方法もあるのですね。勉強になりました。ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) 2つ目のコンボボックスが動作しません。 3 2023/03/25 12:29
- Excel(エクセル) マクロで最終行から上に検索を逆にしたい 1 2022/05/17 18:27
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Excel(エクセル) エクセル 値をコピペした時に、条件付き書式で塗られた背景色もペーストさせる 2 2023/04/05 17:21
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Visual Basic(VBA) ユーザーフォームの書き出しで追加のご相談 ユーザーフォームの値をシートに書き出す際、コードが表示され 2 2022/08/05 10:58
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
-
4
エクセルVBA テキストボックスへのセットフォーカスについて
Visual Basic(VBA)
-
5
エクセル 日付による並べ替えのマクロ
Excel(エクセル)
-
6
【excelVBA】Findメソッドで検索対象を複数列
Excel(エクセル)
-
7
別のシートから値を取得するとき
Visual Basic(VBA)
-
8
EXCEL あるセルに数字が入力されれば既存マクロ実行させたい
Excel(エクセル)
-
9
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
10
VBAでシートコピー後、シート名が重複している時の処理
Access(アクセス)
-
11
エクセルのマクロで検索・抽出したデータを修正及び更新して元データに反映
Excel(エクセル)
-
12
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
13
Excel マクロ:変数を複数使う場合
Excel(エクセル)
-
14
エクセル マクロ オートフィルの終点の指定について
Excel(エクセル)
-
15
配列でデータが入っている要素を求める方法
Visual Basic(VBA)
-
16
「選択範囲を解除してアクティブセルを選択」をマクロで行うにはどうすればよいでしょうか
Excel(エクセル)
-
17
VBA 列全体を別シートの列と比較し、同じ値がある行の、右端に値をコピーする方法について
Excel(エクセル)
-
18
連続する複数のセル値がすべて0であることを判定するマクロ
Visual Basic(VBA)
-
19
Excel VBAでのWorksheet_Changeが動作しない原因
Excel(エクセル)
-
20
i=cells(Rows.Count, 1)とi=cells(Rows.Count, 2)の違い
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
private subモジュールを他のモ...
-
マクロで、次のコードへ行く前...
-
特定の名前のオートシェイプの...
-
Word VBA。各マクロの間に待ち...
-
シグナル 6(SIGABRT)とは?
-
バッチファイルでのエラー処理...
-
vbaのエラー対応(実行時エラー...
-
どう増強すべきか
-
【C#】Page_Loadさせない方法に...
-
特定のファイルを他のプロセス...
-
どうやってもFor文を抜けてしま...
-
Excel VBA セルの名前があるか...
-
複数個のTextBoxでいずれかの内...
-
エクセル VBAで複数セル選択時...
-
シートモジュールを複数作成す...
-
【VBA】エラー処理で別プロシー...
-
順番に処理させたい
-
ASP.netにて質問です。
-
“try/catch”と“if/else”
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【C#/Java?】try-catchでcatch...
-
IF文に時間(何時から何時ま...
-
private subモジュールを他のモ...
-
シグナル 6(SIGABRT)とは?
-
Functionで戻り値を複数返す方法
-
特定の名前のオートシェイプの...
-
ExcelのVBAで、選択したファイ...
-
マクロで、次のコードへ行く前...
-
どう増強すべきか
-
VBA 複数の行を高速で削除する...
-
Excel VBA セルの名前があるか...
-
特定のファイルを他のプロセス...
-
Word VBA。各マクロの間に待ち...
-
どうやってもFor文を抜けてしま...
-
【VBA】エラー処理で別プロシー...
-
エクセル VBAで複数セル選択時...
-
シェルスクリプトでファイル内...
-
【Vb.net】プリンタジョブの取得
-
vbaのエラー対応(実行時エラー...
-
VBAでBook読み込み時の非表示方...
おすすめ情報