- ベストアンサー
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で作成しようと奮闘しているのですが素人&初心者な私には全くと言っていいほど作成が前に進みません。 どなたかご教授を願えませんでしょうか。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#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 とか?
その他の回答 (4)
- n-jun
- ベストアンサー率33% (959/2873)
#3です。 >myDic(Mid(r.Value, 3, 4) * 1) = Empty myDic(Mid(r.Value, 2, 10) * 1) = Empty に変更して下さい。
お礼
n-jun様 お返事遅れまして申し訳ございませんでした。 結局、社長を説得したのと、比較的安く作成してくれる業者が見つかったので、そちらにお願いすることになりました。 いろいろとお知恵を貸していただきましてありがとうございました
- hige_082
- ベストアンサー率50% (379/747)
質問がよく分からんけど 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さんのコードには、かないません
お礼
hige_082様 ご回答ありがとうございます。 n-jun様とは違ったコードですが、こちらも同様1行1行構文の意味を理解しながら勉強していきたいと思っています。 ご回答ありがとうございました。
- n-jun
- ベストアンサー率33% (959/2873)
#1です。 バーコード表に ab1234cd ef1234gh と言うように、コードとしては別でも数字部分が同じ場合があるかどうかなんですけど。 >Range("B1").Value = Mid(okikae, 2, 10) 文字数は一定でしたか。 不定かと思って回答してみました。
お礼
n-jun様 ご説明が不十分で申し訳ございませんでした
- n-jun
- ベストアンサー率33% (959/2873)
バーコードの数字部分を抜き出すのなら、 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 こんなやり方もありますけど、抜き出した数字が重複するような事があるかどうかで変わってくるかも。
お礼
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行だけなら抜き出せるのですが、次行へループさせていくところで躓きました。 そしてこの先に苦難が待ってる事も予想してます。。。 回答ありがとうございました。
お礼
n-jun様 改訂版ありがとうございます。 意図する結果ではなかったのですが、今後の為にも印刷して構文の意味を勉強しようと思います。そしてn-jun様に頂いたコードを参考にしながら完成させようと思っています。 ただ・・・・・難しい>< もっともっと勉強していきたいと思います。 このたびはありがとうございました。 またわからなくなっていきずまったら質問させてください