こんにちは。
こちらのサイトで協力いただき作成しましたコードがありまして、
内容は下記のようなものとなっております。
※コードの全体は長いのでこちらに乗せております
⇒https://ideone.com/UrULLp
①設定シートからマクロを起動し、ダイアログを開きシート1の入ったファイルを開きます。
②開いたファイル内に【差分】シートを作成後、ダイアログを開きシート2の入ったファイルを開きます
③シート1とシート2のユニークキーが合致するものを検索し下記条件でレコードの書き換えを行います
・レコードがハイフンまたは空欄のもの
※シート2のレコードが空欄やハイフンの場合は転記処理をスキップ
・ステータスが【検討中】【設計Ok】のもの
・設定シート内L列の検索ワードがユニークキーに含まれているもの
④上記条件で転記した行はDF列に【転記あり】と記載
⑤シート1のレコードに日付等の情報がある場合転記は行わずDE列に【変更有】と記載し、②にて作成した差分シートに転記
⑥シート1に存在するユニークキーがシート2に存在しなかった場合DE列に【レコード削除】と記載
これで運用開始していたのですが元データの変更があり、列名が重複するようになってしまい処理がされなくなってしまいました
※例えばH列の出店開始日等からスキップされ、支店③から転記されるようになっています
配列内に同じものが格納できないと思うのですが、元データのほうはいじれないので
何か解決策があればご教授いただけると幸いです。
(各種ファイルの画像を捕捉に入れておきます)
No.3ベストアンサー
- 回答日時:
ありがとうございます!
無事に想定した動きになっております…
これから細かい検証を行っていきます!
tatsumaru77さんにはいつも助けていただいて高級ディナーでもご馳走しないといけないレベルで助かっております…
ありがとうございました!
No.7
- 回答日時:
No.6です。
この場合のコード例です。
Dim ch As Boolean
Dim st1() As String, st2() As String
Dim i As Long, n1 As Integer, n2 As Integer
n1 = 0
n2 = 0
ch = False
For i = 0 To 10
'項目存在チェック
If i Mod 2 = 0 Then
ReDim Preserve st1(n1)
st1(n1) = i & "は管理表にありません"
n1 = n1 + 1: ch = True
End If
'項目の列位置チェック
If i Mod 3 = 0 Then
ReDim Preserve st2(n2)
st2(n2) = i & "の列が異なります"
n2 = n2 + 1: ch = True
End If
Next
If ch Then
MsgBox Join(st1, vbCrLf) & _
vbCrLf & vbCrLf & Join(st2, vbCrLf)
Exit Sub
End If
なるほど!ありがとうございます!
確かにこの様に一覧で表示されると修正も楽そうですね!
勉強になります◎
最近また仕様の変更を言われましたので近々質問上げるかもしれませんがよろしくお願いします…!
No.6
- 回答日時:
No.4です。
お薦めしたループの原文についてですが、1つ見つかったら実行を止めるようになってますけど、不具合が数個あったとしたら実行・停止を何回もしないとなりませんよね?(1個で他の間違いも修正出来たなら関係ないですが。)
動的配列に目的の文字をその都度代入し、停止する際に改行コードでJoinした文字列をメッセージボックスで表示させるとチェックが楽なんじゃないのかな?と。
No.5
- 回答日時:
No.4です。
VBAと言うよりVBやVC#2008でコードを作ってた際にあのような考えを実行してみて、それをVBAに戻したって感じもありますね。
例えばDictionaryオブジェクト(クラスで勉強して)のジャグ配列とかもありました。
No.4
- 回答日時:
直接の回答ではありませんけど。
例えば
>For Each item In dicT2
と言うのはExcelはお馬鹿なので省略は可能なのかもですが、Dictionaryクラスを使うようになるとしたら、メソッドで明示的に Keys なのか Values なのかしておく方が宜しいのではないかなと。
ループの変数名も item になってますが実際取り出しているのは key ですよね。
引継ぎとかがあった際に次の人が混乱しないよう余り省略は癖をつけない方が良いのかな?と20年程前にご指導いただきました。
あと、
----
'項目存在チェック
For Each item In dicT2
If dicTw.Exists(item) = False Then
MsgBox (item & "は管理表にありません")
Exit Sub
End If
Next
'項目の列位置チェック
For Each item In dicT2
wcols = dicT2(item)
If tsh.Cells(3, wcols).Value <> item Then
MsgBox (item & "の列が異なります")
Exit Sub
End If
Next
----
ここって同じループをわざわざ分けてますけど、1つのループにされた方が良いのではないかなと個人的には思います。(結果としてマクロ実行の中断が目的であるので)
もっと言えば変数の宣言をグローバルにして類似するループ類は1つのユーザー定義関数にて判定・条件結果を出させた方がスッキリしそうにも思えます。
初級レベルなジジィですから的外れかもですけど、若かりし頃の諸先輩がたが行なってた方法のまねごとです。
今はPCスペックもあがり気にされないのかもですけど。
No.2
- 回答日時:
No1です。
No1に誤りがありました。
訂正版は以下になります。
https://ideone.com/RAwon9https://ideone.com/RAwon9
こちらで、動作確認は行っておりません。
また、「シート2にありシート1にないユニークキーを追加する」個所が
現在、コメントになっていますが、こちらも修正してあります。
コメントを解除して、こちらの試験も行ってください。
No.1
- 回答日時:
修正版を下記URLにアップしました。
https://ideone.com/BYTRIT
こちらで、動作確認は行っておりません。
また、「シート2にありシート1にないユニークキーを追加する」個所が
現在、コメントになっていますが、こちらも修正してあります。
コメントを解除して、こちらの試験も行ってください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelで、別シートの表のステータスに伴った動的な自動転記をしたいです。 2 2023/06/14 15:56
- Visual Basic(VBA) VBAで、シート間の転記するコードをFOR~NEXTで教えてください。 9 2023/04/30 20:04
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) 複数ブックの統合について Excel VBA 1 2022/05/13 09:48
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 2つの条件に合うセルにデータを転記したい 4 2022/12/02 11:05
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- Excel(エクセル) 【マクロ】マクロが保存されているエクセルとは、別のエクセルブックの全シートの非表示列を再表示したい 1 2022/12/24 20:48
- Visual Basic(VBA) vbaについて 主に以下のような設定をしたいです。 Aブックの表の行数が20未満だったら Bブックの 1 2023/06/08 23:40
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
別のシートから値を取得するとき
-
ユーザーフォームに入力したデ...
-
XL:BeforeDoubleClickが動かない
-
セルの値によって、シート見出...
-
【ExcelVBA】全シートのセルの...
-
【VBA】色のついたシート名を取得
-
エクセルのシート名変更で重複...
-
ブック名、シート名を他のモジ...
-
ExcelVBA シート名を複数セルか...
-
VBAでオブジェクト変数にsetし...
-
Worksheet_Changeの内容を標準...
-
同じ作業を複数のシートに実行...
-
VBAの天才来てください
-
特定の文字を含むシートだけマ...
-
実行時エラー'1004': WorkSheet...
-
別のシートを参照して計算する方法
-
【VBA】指定した検索条件に一致...
-
ExcelのVBAのマクロで他のシー...
-
【Excel VBA】Worksheets().Act...
-
excelのマクロで該当処理できな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
別のシートから値を取得するとき
-
ユーザーフォームに入力したデ...
-
Excelマクロのエラーを解決した...
-
excelのマクロで該当処理できな...
-
同じ作業を複数のシートに実行...
-
ExcelVBA シート名を複数セルか...
-
【ExcelVBA】全シートのセルの...
-
Excel マクロについての相談
-
VBA 存在しないシートを選...
-
実行時エラー'1004': WorkSheet...
-
特定の文字を含むシートだけマ...
-
ExcelのVBAのマクロで他のシー...
-
ブック名、シート名を他のモジ...
-
XL:BeforeDoubleClickが動かない
-
VBA 複数の各シートに行を追加...
-
エクセルのシート名変更で重複...
-
【Excel VBA】Worksheets().Act...
-
シートが保護されている状態で...
-
Excel VBA 複数行を数の分だけ...
-
for 文の 繰り返し処理に使える...
おすすめ情報
シート2です
設定シートです