VBA初心者が身の程をわきまえずに、大作にいどまざるを得なくなり大苦戦しております。
どうか助けてください。
下記のステップ③の部分をなんとか考えてみましたがお手上げです。
Application.EnableEventsで囲うのもあっているのかどうか・・・
①集約用のエクセルを用意(ブックAとします)
②編集用のエクセルを用意(ブックBとします)
③編集者は編集用エクセルを編集(手動)
CHANGEにて変更があった箇所を表示(マクロ)
Sub Book_Data_Copy()
Dim wb_A As Workbook, wb_B As Workbook
Dim ws_A_Pasteto As Worksheet, ws_B_Copyfm As Worksheet
Dim i As Integer 'Aから値を見つける行カウンタ
Dim fcell As Object '見つかったオブジェクト
Dim Key As String '検索する値
Dim frow As Integer '見つかった行番号
i = 1
Set wb_A = ThisWorkbook
Set wb_B = Workbooks.Open("C:\Users\XXXXX\Desktop\Sample2.xlsm")
Private Sub Worksheet_Change(ByVal Target As Range)
'③変更フラグと記載フラグの処理
'AH4からAK379 4行目から379行目まで34列目から37列目までという条件
Application.EnableEvents = False
If (Target.Row >= 4 And Target.Row <= 379) And (Target.Column >= 34 And _
Target.Column <= 37) Then
'AAA列に8を書き出す
Range("AAA" & Target.Row).Value = 8
End If
Application.EnableEvents = True
なにとぞよろしくお願いします。
No.2ベストアンサー
- 回答日時:
とりあえずわからないので。
フラグは付けず、AとBを比較し違うもののみAへ転記します。
Sub Book_Data_Copy()
'変更フラグと記載フラグの処理はありません。
'全データを探し、AのD列の値がBにあればBからAへ値を転記します。
'重複データがあった場合は上書きをされます。
Dim wb_A As Workbook, wb_B As Workbook
Dim ws_A_Pasteto As Worksheet, ws_B_Copyfm As Worksheet
Dim i As Integer 'Aから値を見つける行カウンタ
Dim fcell As Object '見つかったオブジェクト
Dim Key As String '検索する値
Dim frow As Integer '見つかった行番号
i = 1
Set wb_A = ThisWorkbook
Set wb_B = Workbooks.Open("C:\Users\motoki\Desktop\Sample2.xlsm")
Set ws_A_Pasteto = wb_A.Worksheets("Bdata")
Set ws_B_Copyfm = wb_B.Worksheets("Bdata")
'AのD列の値をBから検索(完全一致)
Do While ws_A_Pasteto.Cells(i, "D") <> ""
Key = ws_A_Pasteto.Cells(i, "D")
With ws_B_Copyfm.Columns("D")
Set fcell = .Find(What:=Key, LookIn:=xlValues, lookat:=xlWhole, _
SearchOrder:=xlByColumns, MatchByte:=False)
If Not fcell Is Nothing Then
frow = fcell.Row
If ws_A_Pasteto.Range("AH" & i) <> ws_B_Copyfm.Range("AH" & frow) Or ws_A_Pasteto.Range("AI" & i) <> ws_B_Copyfm.Range("AI" & frow) Or _
ws_A_Pasteto.Range("AJ" & i) <> ws_B_Copyfm.Range("AJ" & frow) Or ws_A_Pasteto.Range("AK" & i) <> ws_B_Copyfm.Range("AK" & frow) Then
ws_A_Pasteto.Range("AH" & i & ":" & "AK" & i).Value = ws_B_Copyfm.Range("AH" & frow & ":" & "AK" & frow).Value 'BのAH→AのAHへ値をコピー
End If
End If
End With
i = i + 1
Loop
wb_B.Close
Set wb_A = Nothing
Set wb_B = Nothing
Set ws_A_Pasteto = Nothing
Set ws_B_Copyfm = Nothing
End Sub
No.4
- 回答日時:
ANo3です。
>実はブックBは、複数存在し、B1, B2, B3・・・
>複数の人が作業し、担当する行だけ編集後にブックAにまとめる
そのような場合は、ご質問のように単純にコピペするマクロでは上手くいかない可能性がありそうです。
担当する部分が決まっているなら、まず、担当外の範囲はブックAには反映しないようにしておく方がよさそうに思います。なぜなら謝って変更しても担当外なので気付きにくいと想像しますし、それもそのまま反映されてしまうことになります。
更には、ブックBの担当外のデータは、ブックAが更新されても古いままということになりますよね?
関係ないので古くても問題がないというのであれば、初めから担当外のデータは表示せずに、必要な部分だけの入力ができるような設計にしておく方が良さそうな気がします。
あるいは、シートの保護などを利用して、あらかじめ変更可能なセルをそれぞれに限定しておくといったことも考えられます。
また、複数の人が作業をする場合は、ブックAへの書き込みが同時に発生する可能性があるということなので、これに対する配慮も必要になると思われます。
起こる確率は少ないかも知れませんが、エラーで止まってしまった時に、皆が適切な対処がとれるとは限りませんので。
全体がよくわからないのでなんとも言えませんが、補足と併せて考えると・・
・各担当がキチンと分かれているのなら、ブックAを開く時にそれぞれのブックBからデータを読み込むマクロを設定しておくだけでも事足りるように思います。でも、値の参照だけなので、マクロにしなくても参照式を設定しておけば済みそうですね。
・担当に重複があって、変更の最新情報を即時に反映しなければならないということだとすると、上記では上手くいきませんね。
私は使ったことがないので詳しくありませんが、複数の人が編集可能で最新情報を維持するという目的で、エクセルには「共有」という機能があるようです。
この機能を上手く使えれば、マクロや参照式も必要なくなるかも知れませんので、一度調べてみてはいかがでしょうか。
お礼が遅くなりすみません。
エクセルの共有機能という作戦もありだと気付かせていただきありがとうございます。
マクロでうまく運用できない時には、その方法にしようと思います。
No.3
- 回答日時:
こんにちは
よくわからないのですが、ご提示のコードではなく、質問のタイトルから類推すると、ブック Bは編集(入力)専用にしておいて、最終的には、ブックBのAH4:AK379の内容をブック Aに常に反映しておきたいということなのでしょうか?
もしそうであるなら、変更個所や差分などを調べなくとも、常に全体が反映されるようにしておけば良いように思います。
マクロで処理するなら、(例えば)ブックB保存時に範囲全体をコピペするとかでも済みそうです。
ブックAの関数式で、対称範囲を参照するように設定しておくのもありかもしれません。
よくわかっておらずに回答していますので、的外れでしたら、スルーしてください。
こんにちは
ご提案ありがとうございます。
実はブックBは、複数存在し、B1, B2, B3・・・
複数の人が作業し、担当する行だけ編集後にブックAにまとめるという作業になるため、変更箇所のみを対象としたいと思っております。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Excel(エクセル) エクセル 値をコピペした時に、条件付き書式で塗られた背景色もペーストさせる 2 2023/04/05 17:21
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA シートをコピーする際に Co...
-
【ExcelVBA】zip圧縮されたCSV...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
ワイルドカード「*」を使うとう...
-
【困っています2】VBA 追加処...
-
VBA シート名が一致した場合の...
-
EXCEL VBA 単語置き換え につい...
-
ExcelのVBAです。フォルダ内の...
-
エクセル VBA 他シートの行を選...
-
エクセルVBAで書式と値の貼付け...
-
VBA 別ブックからコピペしたい...
-
VBS Bookを閉じるコード
-
マクロで最終行を取得したい
-
【前回の続き続きです、ご教示...
-
クリップボードに貼付している...
-
Excel-VBAでのファイルの開き方
-
VBAで別ブックのシートを指定し...
-
【マクロ】違うフォルダにある...
-
VBSでExcelのオープン確認
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートをコピーする際に Co...
-
エクセルVBAが途中で止まります
-
別ブックをダイアログボックス...
-
ワイルドカード「*」を使うとう...
-
エクセルのマクロについて教え...
-
エクセルのマクロについて教え...
-
VBS Bookを閉じるコード
-
【ExcelVBA】インデックスが有...
-
VBA コードを実行すると画面が...
-
【ExcelVBA】zip圧縮されたCSV...
-
vbaでvbaProjectのパスワード解...
-
VBAで別ブックのシートを指定し...
-
ExcelのVBAです。フォルダ内の...
-
vbaで他のブックに転記したい。...
-
フォルダ内の全てのファイルに...
-
VBAで複数のブックを開かずに処...
-
VBSでExcelのオープン確認
-
VBA 実行時エラー 2147024893
-
【Excel VBA】書き込み先ブック...
-
VBA シート名が一致した場合の...
おすすめ情報