• ベストアンサー

VBAでMIDとFor~を使用したループがどうしても作成できません

A        B       C        D 商品コード  バーコード  未入荷コード  誤入荷コード 1234      ka1234bc            5342 1236      kh1236hc 2734      as3642hf 8512      gd2734hf    8512 3642      gf5342hd 1.バーコードの順番は商品コードの順番とは異なる 2.バーコードの文字からアルファベット部分取り除きたい 3.未入荷の商品は商品コードと同じ行に表示したい 4.誤入荷コードは先頭行から表示をしたい 5.商品コードの行数とバーコードの行数は必ずしもイコールではない 6.商品コード・バーコードの行数は300~500くらい こんな事をVBAで作成しようと奮闘しているのですが素人&初心者な私には全くと言っていいほど作成が前に進みません。 どなたかご教授を願えませんでしょうか。

この投稿のマルチメディアは削除されているためご覧いただけません。

質問者が選んだベストアンサー

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

#2です。 バーコードの数字部分が同じ位置であれば、 Sub try() Dim myDic As Object Dim r As Range, rr As Range Set myDic = CreateObject("Scripting.Dictionary") Application.ScreenUpdating = False For Each r In Range("B2", Cells(Rows.Count, 2).End(xlUp)) myDic(Mid(r.Value, 3, 4) * 1) = Empty Next For Each rr In Range("A2", Cells(Rows.Count, 1).End(xlUp)) If myDic.Exists(rr.Value) Then myDic.Remove (rr.Value) Else rr.Offset(, 2).Value = rr.Value End If Next If myDic.Count <> 0 Then Range("D2").Resize(myDic.Count, 1).Value = _ Application.Transpose(myDic.keys) End If Application.ScreenUpdating = True Set myDic = Nothing End Sub とか?

takaboo191
質問者

お礼

n-jun様 改訂版ありがとうございます。 意図する結果ではなかったのですが、今後の為にも印刷して構文の意味を勉強しようと思います。そしてn-jun様に頂いたコードを参考にしながら完成させようと思っています。 ただ・・・・・難しい>< もっともっと勉強していきたいと思います。 このたびはありがとうございました。 またわからなくなっていきずまったら質問させてください

その他の回答 (4)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.5

#3です。 >myDic(Mid(r.Value, 3, 4) * 1) = Empty myDic(Mid(r.Value, 2, 10) * 1) = Empty に変更して下さい。

takaboo191
質問者

お礼

n-jun様 お返事遅れまして申し訳ございませんでした。 結局、社長を説得したのと、比較的安く作成してくれる業者が見つかったので、そちらにお願いすることになりました。 いろいろとお知恵を貸していただきましてありがとうございました

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.4

質問がよく分からんけど Sub test() Dim i As Long, ii As Long Range("a2", Cells(65336, 1).End(xlUp)).Copy Range("c2").PasteSpecial Application.CutCopyMode = False For i = 2 To Cells(65536, 2).End(xlUp).Row For ii = 2 To Cells(65536, 1).End(xlUp).Row If Cells(ii, 1) = CInt(Mid(Cells(i, 2), 3, 4)) Then Cells(ii, 3) = "" Exit For End If Next ii If ii > Cells(65536, 1).End(xlUp).Row Then Cells(65536, 4).End(xlUp).Offset(1, 0) = Mid(Cells(i, 2), 3, 4) End If Next i End Sub 多分外してるけどね n-junさんのコードには、かないません

takaboo191
質問者

お礼

hige_082様 ご回答ありがとうございます。 n-jun様とは違ったコードですが、こちらも同様1行1行構文の意味を理解しながら勉強していきたいと思っています。 ご回答ありがとうございました。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

#1です。 バーコード表に ab1234cd ef1234gh と言うように、コードとしては別でも数字部分が同じ場合があるかどうかなんですけど。 >Range("B1").Value = Mid(okikae, 2, 10) 文字数は一定でしたか。 不定かと思って回答してみました。

takaboo191
質問者

お礼

n-jun様 ご説明が不十分で申し訳ございませんでした

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

バーコードの数字部分を抜き出すのなら、 Sub try() Dim RegExp As Object Dim st As String Set RegExp = CreateObject("VBScript.Regexp") RegExp.Pattern = "\D+" RegExp.Global = True st = "abc12345def" MsgBox st & " の数字部分は " & RegExp.Replace(st, "") Set RegExp = Nothing End Sub こんなやり方もありますけど、抜き出した数字が重複するような事があるかどうかで変わってくるかも。

takaboo191
質問者

お礼

n-jun様 上記コードを試して早速みました。msgboxでは「12345」は表示されました。 しかし数字を抜き出すだけなら私にもできたのです。 Sub mojiokikae() Dim okikae As String okikae = Sheets(1).Cells(1, 2).Value Range("B1").Value = Mid(okikae, 2, 10) End Sub こんな感じで1行だけなら抜き出せるのですが、次行へループさせていくところで躓きました。 そしてこの先に苦難が待ってる事も予想してます。。。 回答ありがとうございました。

関連するQ&A