オンライン健康相談、gooドクター

こんにちは。
こちらのサイトで協力いただき作成しましたコードがありまして、
内容は下記のようなものとなっております。
 ※コードの全体は長いのでこちらに乗せております
  ⇒https://ideone.com/UrULLp

①設定シートからマクロを起動し、ダイアログを開きシート1の入ったファイルを開きます。
②開いたファイル内に【差分】シートを作成後、ダイアログを開きシート2の入ったファイルを開きます
③シート1とシート2のユニークキーが合致するものを検索し下記条件でレコードの書き換えを行います
 ・レコードがハイフンまたは空欄のもの
  ※シート2のレコードが空欄やハイフンの場合は転記処理をスキップ
 ・ステータスが【検討中】【設計Ok】のもの
 ・設定シート内L列の検索ワードがユニークキーに含まれているもの
 
④上記条件で転記した行はDF列に【転記あり】と記載
⑤シート1のレコードに日付等の情報がある場合転記は行わずDE列に【変更有】と記載し、②にて作成した差分シートに転記
⑥シート1に存在するユニークキーがシート2に存在しなかった場合DE列に【レコード削除】と記載


これで運用開始していたのですが元データの変更があり、列名が重複するようになってしまい処理がされなくなってしまいました
※例えばH列の出店開始日等からスキップされ、支店③から転記されるようになっています

配列内に同じものが格納できないと思うのですが、元データのほうはいじれないので
何か解決策があればご教授いただけると幸いです。
(各種ファイルの画像を捕捉に入れておきます)

「連想配列内に同じ値があり処理がスキップさ」の質問画像

質問者からの補足コメント

  • シート2です

    「連想配列内に同じ値があり処理がスキップさ」の補足画像1
      補足日時:2021/03/14 11:35
  • 設定シートです

    「連想配列内に同じ値があり処理がスキップさ」の補足画像2
      補足日時:2021/03/14 11:35
gooドクター

A 回答 (7件)

No2です。


URLが誤っていました。下記が正しいURLです。
https://ideone.com/RAwon9
    • good
    • 1
この回答へのお礼

ありがとうございます!
無事に想定した動きになっております…

これから細かい検証を行っていきます!
tatsumaru77さんにはいつも助けていただいて高級ディナーでもご馳走しないといけないレベルで助かっております…
ありがとうございました!

お礼日時:2021/03/15 10:45

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
「連想配列内に同じ値があり処理がスキップさ」の回答画像7
    • good
    • 0
この回答へのお礼

なるほど!ありがとうございます!
確かにこの様に一覧で表示されると修正も楽そうですね!
勉強になります◎
最近また仕様の変更を言われましたので近々質問上げるかもしれませんがよろしくお願いします…!

お礼日時:2021/03/19 16:11

No.4です。



お薦めしたループの原文についてですが、1つ見つかったら実行を止めるようになってますけど、不具合が数個あったとしたら実行・停止を何回もしないとなりませんよね?(1個で他の間違いも修正出来たなら関係ないですが。)

動的配列に目的の文字をその都度代入し、停止する際に改行コードでJoinした文字列をメッセージボックスで表示させるとチェックが楽なんじゃないのかな?と。
    • good
    • 2

No.4です。



VBAと言うよりVBやVC#2008でコードを作ってた際にあのような考えを実行してみて、それをVBAに戻したって感じもありますね。
例えばDictionaryオブジェクト(クラスで勉強して)のジャグ配列とかもありました。
    • good
    • 1

直接の回答ではありませんけど。



例えば
>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スペックもあがり気にされないのかもですけど。
    • good
    • 2
この回答へのお礼

いつも助言ありがとうございます!
如何せんVBAの知識が足りないためとても勉強になります…!

お礼日時:2021/03/15 10:46

No1です。


No1に誤りがありました。
訂正版は以下になります。
https://ideone.com/RAwon9https://ideone.com/RAwon9

こちらで、動作確認は行っておりません。
また、「シート2にありシート1にないユニークキーを追加する」個所が
現在、コメントになっていますが、こちらも修正してあります。
コメントを解除して、こちらの試験も行ってください。
    • good
    • 1

修正版を下記URLにアップしました。


https://ideone.com/BYTRIT
こちらで、動作確認は行っておりません。
また、「シート2にありシート1にないユニークキーを追加する」個所が
現在、コメントになっていますが、こちらも修正してあります。
コメントを解除して、こちらの試験も行ってください。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

gooドクター

人気Q&Aランキング