
いつも御世話になっております。
以下のことをしたいのですが、詰まってしまいました。
皆様の力をお借りしたいと思い、書き込ませていただきます。
・ボタン1をクリックすると、base(転記元)のG列に書かれた事項と同一のシート(転記先)へ転記する(各シートA,B,Cへ転記)
・転記先のE列を見て、既存のものであれば、上書きする
・転記先のE列を見て、新規のものであれば、空いている行を探し転記する。
(例)
base(転記元シート)
E1|F1|G1
名前収入シート先
月曜50A
火曜100A
木曜150C
土曜50A
日曜100B
水曜150A
金曜10C
転記実行前
A(転記先シート)
E1|F1|G1
名前収入シート先
月曜A
火曜A
土曜A
転記実行後
A(転記先シート)
E1|F1|G1
名前収入シート先
月曜50A
火曜100A
土曜50A
水曜150A
以下に作成したプログラムを記述します。
が、IF文に関するエラーが生じております。
Sub ボタン1_Click()
Dim dstSheet As Worksheet
Dim srcRow As Long
Dim dstRow As Long
Dim name As Integer
Dim obj As Object
Set srcSheet = Sheets("base")
For srcRow = 2 To srcSheet.Range("G" & Rows.Count).End(xlUp).Row '元シートのデータ範囲で繰り返し(シート先は必須なのでG列でチェック)
If srcSheet.Range("G" & srcRow).Value <> "" Then '(転記先シート名)が空白でない場合に実行(1)
Set dstSheet = Sheets(srcSheet.Range("G" & srcRow).Value) 'シート取得(1)
name = Sheets(srcSheet.Range("E" & srcRow).Value) '名前を取得(1)
Set obj = Worksheets(dstSheet).Cells.Find(name) '名前を転記先の中で検索(1)
End If '(1)の終了
If obj Is Nothing Then '検索でかからなかったら、新たに空白の行を見つけて転記元から転記先へ転記する(3)
'以下3行問題点????
dstRow = dstSheet.Range("G" & Rows.Count).End(xlUp).Row + 1 '転記先行取得
If dstSheet.Range("E2") = "" Then dstRow = 1 '質問で転記先には1行目からなので、それに対応
dstSheet.Range("E" & dstRow).Resize(1, 3).Value = srcSheet.Range("E" & srcRow).Resize(1, 3).Value 'データ転記
End If
Else '検索でかかったら、該当の行のアドレスを割り出し、特定の範囲を上書きする。(4)
lngYLine = obj.Row
intXLine = obj.Column
With Sheets(dstSheet) '検索でかかったら、該当の行のアドレスを割り出し、特定の範囲を上書きする。(4)
dstSheet.Range("E" & lngYLine).Resize(1, 3).Value = srcSheet.Range("E" & srcRow).Resize(1, 3).Value 'データ転記(4)
End If '(3),(4)の終了
Set obj = Nothing 'Objの初期化
Next
End Sub
No.4ベストアンサー
- 回答日時:
前回の続きみたいですね。
提示のコードはあちこちミスがあり(^^;;;
それらをいちいち文言で指摘するのがちょと面倒なので
訂正加筆したコードをアップします。
以下をコピペして実行してみてください。
'-----------------------------------------
Sub ボタン1_Click()
Dim srcSheet As Worksheet
Dim dstSheet As Worksheet
Dim srcRow As Long
Dim dstRow As Long
Dim name As String
Dim obj As Range
Set srcSheet = Sheets("Base")
For srcRow = 2 To srcSheet.Range("G" & Rows.Count).End(xlUp).Row
If srcSheet.Range("G" & srcRow).Value <> "" Then
Set dstSheet = Sheets(srcSheet.Range("G" & srcRow).Value)
name = srcSheet.Range("E" & srcRow).Value
Set obj = dstSheet.Range("E:E").Find(name, , xlValues, xlWhole)
If obj Is Nothing Then
dstRow = dstSheet.Range("G" & Rows.Count).End(xlUp).Row + 1
If dstSheet.Range("E1") = "" Then
dstRow = 1
End If
dstSheet.Range("E" & dstRow).Resize(1, 3).Value = _
srcSheet.Range("E" & srcRow).Resize(1, 3).Value
Else
dstSheet.Range("E" & obj.Row).Resize(1, 3).Value = _
srcSheet.Range("E" & srcRow).Resize(1, 3).Value
End If
End If
Next
End Sub
'---------------------------------------
変数の型はObjectではなく明示した方がベターです。
また、ちゃんと目的に合った型を宣言すること。
それから、nameという変数はあまり感心しません。
以上。
No.2
- 回答日時:
これでどうでしょう。
---
With Sheets(dstSheet) '←これに対応するEnd Withがない
dstSheet.Range("E" & lngYLine).Resize(1, 3).Value = srcSheet.Range("E" & srcRow).Resize(1, 3).Value 'データ転記(4)
End With '←追加
No.1
- 回答日時:
If dstSheet.Range("E2") = "" Then dstRow = 1
この1行でIfは完結し、その下のEnd Ifは(3)のIf文の終了と判断されています。
If dstSheet.Range("E2") = "" Then
dstRow = 1
こうすればOK
ところで
If obj Is Nothing Then
このIf文は(転記先シート名)が空白の場合も判定されTrueになりますけど大丈夫ですか。
この回答への補足
回答ありがとうございます。
If dstSheet.Range("E2") = "" Then dstRow = 1
↓
If dstSheet.Range("E2") = "" Then
dstRow = 1
で変更しましたが
それでも、IF文のところでひっかかってしまいますね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 他のシートからコピーする下記マクロで貼付け位置をWorksheets(1).Range("A3")の 8 2023/01/30 18:48
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Excel(エクセル) マクロで行を追加、削除すると行位置がずれますが、解決方法はありませんか?。 5 2022/05/28 16:03
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELのSheet番号って変更でき...
-
excel vbaのエラー原因について
-
Count Ifのセルの範囲指定に変...
-
マクロの「SaveAs」でエラーが...
-
【Excel VBA】自動メール送信の...
-
VBA Userformで一部別シートに...
-
Excelのシート別でのセルのリン...
-
祝日を除いた月曜から土曜まで...
-
【マクロ】実行時エラー '424':...
-
Excel UserForm の表示位置
-
選択されたブックを開いてデー...
-
「段」と「行」の違いがよくわ...
-
別シートのデータを参照して値...
-
特定の文字がある行以外を削除...
-
【Excel関数】UNIQUE関数で"0"...
-
VBAでの SendKeysの変数指定方法
-
【Excel VBA】一番右端セルまで...
-
エクセルで数字を認識して、行...
-
vba列範囲の拡大について
-
VBAで条件から範囲を指定して色...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELのSheet番号って変更でき...
-
マクロの「SaveAs」でエラーが...
-
マクロ実行後に別シートの残像...
-
VBA 空白行に転記する
-
VBA別シートの最終行の次行へ転...
-
Count Ifのセルの範囲指定に変...
-
【VBA】データを各シートに自動...
-
Changeイベントで複数セルへの...
-
VBAで変数の数/変数名を動的に...
-
VBA 別ブックからの転記の高速...
-
Excel VBA オートフィルターで...
-
【VBA】特定の条件でセルをコピー
-
VBAでEXCELから固定長...
-
Excel2013で切り取り禁止
-
Unionでの他のシートの参照につ...
-
楽天RSSからエクセルVBAを使用...
-
100万件越えCSVから条件を満た...
-
ExcelのVBマクロを、バックグラ...
-
VBA 実行時エラー1004 rangeメ...
-
同じ作業(データコピー・貼付...
おすすめ情報