[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォームについて』(れいまま)
こんばんは。 またまた教えてください<(__*)>(また れいままだよ〜って思った方ごめんなさい) 今、ユーザーフォームについて勉強しています。 下記のような入力フォームのコードを作ってみました。 (Sheet1) A B C D E F G H I J K L M N O P 番号 伝票番号 お客様のお名前 月 日 ☆ 時間 店所コード 担当店 電話番号 携帯番号 郵便番号 住所@ 住所A 事前連絡 備考
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) TextBox1.Text = FR.EntireRow.Cells(1, "A").Text Me.Tag = FR.Row Set FR = Nothing End Sub Private Sub TextBox2_Exit(ByVal Cancel As MSForms.ReturnBoolean) Range("B2").Value = TextBox2.Text TextBox2.Text = Format(WorksheetFunction.Substitute(TextBox1.Text, "-", ""), "0000-0000-0000") End Sub Private Sub TextBox3_Exit(ByVal Cancel As MSForms.ReturnBoolean) Range("C2").Value = TextBox3.Text End Sub Private Sub TextBox4_Exit(ByVal Cancel As MSForms.ReturnBoolean) Range("D2").Value = TextBox4.Text End Sub Private Sub TextBox5_Exit(ByVal Cancel As MSForms.ReturnBoolean) Range("E2").Value = TextBox5.Text End Sub Private Sub TextBox6_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim FR As Range
With Sheets("時間帯") Set FR = .Range("A:A").Find(TextBox6.Text, , xlValues, xlWhole) If Not FR Is Nothing Then TextBox7.Text = FR.EntireRow.Cells(1, "B").Text Set FR = Nothing End If Range("G2").Value = TextBox7.Text
End With End Sub Private Sub TextBox8_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim FR As Range
With Sheets("店所") Set FR = .Range("A:A").Find(TextBox8.Text, , xlValues, xlWhole) If Not FR Is Nothing Then TextBox9.Text = FR.EntireRow.Cells(1, "D").Text Set FR = Nothing End If Range("H2").Value = TextBox8.Text Range("I2").Value = TextBox9.Text End With End Sub Private Sub TextBox10_Exit(ByVal Cancel As MSForms.ReturnBoolean) Range("J2").Value = TextBox10.Text End Sub Private Sub TextBox11_Exit(ByVal Cancel As MSForms.ReturnBoolean) Range("K2").Value = TextBox11.Text End Sub
Private Sub TextBox12_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim FR As Range
With Sheets("郵便番号") Set FR = .Range("A:A").Find(TextBox12.Text, , xlValues, xlWhole) If Not FR Is Nothing Then TextBox13.Text = FR.EntireRow.Cells(1, "B").Text Set FR = Nothing End If Range("M2").Value = TextBox13.Text
End With End Sub Private Sub TextBox14_Exit(ByVal Cancel As MSForms.ReturnBoolean) Range("N2").Value = TextBox14.Text End Sub
Private Sub TextBox15_Exit(ByVal Cancel As MSForms.ReturnBoolean) Dim FR As Range
With Sheets("事前連絡") Set FR = .Range("A:A").Find(TextBox15.Text, , xlValues, xlWhole) If Not FR Is Nothing Then TextBox16.Text = FR.EntireRow.Cells(1, "B").Text Set FR = Nothing End If Range("O2").Value = TextBox16.Text
End With End Sub Private Sub TextBox17_Exit(ByVal Cancel As MSForms.ReturnBoolean) Range("P2").Value = TextBox17.Text End Sub
Private Sub UserForm_Initialize() TextBox1.TabStop = False '見せるだけで入力しないときはFalseらしい TextBox13.TabStop = False End Sub
BOX17を入力したらPに表示した後 次の行へ入力させたいのですが どうしたらいいのでしょうか? それと CommandButtonで戻るという設定をしたいと思います。 一行戻るのは どういう設定にしたらいいのでしょうか?
お風呂に入ったら閃きました(笑 次の行に入力というのは 常に最終行を取得して その下に書き込みをするようにすればいい! ということですね。 途中まで入力したものは 表示させないようにすれば ずれることはない! おおお〜♪
しかし、一つ前に戻るというのは よく分からないです。どなたか 教えてください。 (れいまま)
行を変数で制御してはどうでしょうか? 次の行に行くには+1して、前に戻るのは−1すればできますよ。
1行単位で移動するものだと思って回答しています。 (やっちん)
やっちんさん>おはようございます。 そうなのです。1行単位です。 +1 -1ですね。 なるほど。思いつかなかったです。 これが完成すれば 色々な入力作業に応用できます。 画面が どんなに横に長くても画面を移動しなくてすみますから。 入力作業の時間短縮になります。 ありがとうございました(嬉 (れいまま)
戻すのは確認の為に表示するだけですか?それとも一部を入力し直す為ですか? 戻るのが1つ前までの限定であれば問題ないと思いますが、複数行も戻る場合は新規 に入力するときに最終行を取得するか最終行を保持しておく必要があるでしょうね。 そうしないと入力済みの行を上書きしていってしまいます。 (やっちん)
やっちんさん>こんにちは。 確認が主ですが、確認作業で間違いがあったら訂正したいですね。 新しくコマンドボタンを作って修正できるようにした方がいいかもしれないですね。 ありがとうございます。 (れいまま)
えーーと、 最下行のセル、アドレス、または行などを一度変数に格納してやれば、 どこに移動しようと、戻れますよね? (seiya)
えと、このスレに関係無い事ですけど、ごめんなはれや。 一応出来上がりましたんで、検証頼んます。(例の所) バイオレットで塗ってあるセルは完全一致が不可能なデータデスワ。 それと正規のデータは横のセルに逃がしてあります。本データは曖昧な数値になっとり ますもんで、違いがハッキリしたデータで検証すべきと思いましてナ。 ただまぁ、元に戻す際は今一度再確認お願いします。 住所を入力したら半角に変換にするのをお忘れ無く。 住所が全く同じやと、空白行で表示されます。 (弥太郎)
seiyaさん>こんばんは。o(^-^ o ) 全て変数に格納することで 何番目を参照しても新しい行に 移動できるということですよね。 れいまま 変数を自分のものにする良いチャンスだと思っています。 だから 頑張りますw
ちなみに ユーザーフォームの内容は
No【BOX1】 伝票番号をハイフォンなしで入力してください 【BOX2】 お客さまの名前を入れてください 【BOX3】 日にち 時間を選んでください 【BOX4】月【BOX5】日 【BOX6】【BOX7】 1 AM 2 PM 3 FREE 担当店を入力してください 電話番号 【BOX8】 【BOX10】 【BOX9】店 【BOX11】 郵便番号を入れてください 【BOX12】 住所を入れてください 事前連絡 【BOX13】(郵便番号を入れると表示されます) 【BOX15】【BOX16】 【BOX14】(番地など手入力します) 1 ○ 2 × 備考 【BOX17】 です。 出来上がったらアップするので見てくださいね。 今、【BOX1】にNOをふる関数を本で調べているところです。 変数 早速試しま〜す
弥太郎さん♥o(^-^ o ) ありがとうございます。早速見てみます☆ とっても嬉しいです♪ヾ(●⌒∇⌒●)ノ わーい 実物で検証するのは年明けになってしまうかもしれません。 会社のPCの前でゆっくりマクロいじる時間がとれないのです(涙 弥太郎さんのマクロがうまくいったら 上のユーザーフォームの担当店で活躍しそうです (れいまま)
弥太郎さん!! これすごい!れいまま 早く試したくなったです! 年内に裏技を使って試します(笑 紫のところは そうそう注文ないでしょう。 だからOkだと思います。 本当にありがとうございます! 来年の繁忙期は これでばっちりです! (れいまま)
>来年の繁忙期は これでばっちりです! 世の中そう上手い事でけておりまへんわ。(笑 さっそく不具合を発見(藤沢○丁目で)しましたんで、下のコードと差し替えておくん なはれ。 それと先方とのやりとり上全角がベターやと思いますんで、変数上だけで半角に変換検 索するよう書き換えときました。5,600のデータやと.0x秒程遅くなるだけですから問題 おまへんやろ? (弥太郎) '---------------- Sub ReimamaVer4() Dim dic As Object, i As Long, n As Integer, Rex As Object, tbl, x, ky Dim flag As Boolean, d_1 As String, d_2 As String, chck_data As Long Dim maxrow As Long, maxcol As Integer, fnd_data As String Dim a_1 As String, a_2 As String, a_3 As Long, c_data As String Dim md_1 As Integer, md_2 As Integer, myflg As Boolean, myflg_1 As Boolean Dim myflg_2 As Boolean
Set dic = CreateObject("scripting.dictionary") Set Rex = CreateObject("vbscript.regexp")
With Sheets("作業") tbl = .Range("h2").Resize(.Range("h" & Rows.Count).End(xlUp).Row - 1) ReDim x(1 To UBound(tbl, 1), 1 To 1) With CreateObject("vbscript.regexp") On Error Resume Next For i = 1 To UBound(tbl, 1) fnd_data = StrConv(tbl(i, 1), vbNarrow) Rex.Pattern = "^(神奈川県)*(.+市|中郡|足柄上郡|.+郡.+町)(.+)" a_1 = Rex.Replace(fnd_data, "$2") a_2 = Rex.Replace(fnd_data, "$3") Rex.Pattern = "\d+" If Rex.test(a_2) Then a_3 = Rex.Execute(a_2)(0) Else a_3 = 0 End If dic(a_1 & "," & a_2) = Array(a_3, i) On Error GoTo 0 Next i End With End With With Sheets("担当店一覧") maxrow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row maxcol = .Cells.Find("番号", , , , xlByColumns, xlPrevious).Column tbl = .Range("a1").Resize(maxrow, maxcol).Value For Each ky In dic.keys d_1 = Split(ky, ",")(0) d_2 = Split(ky, ",")(1) c_data = d_2 myflg = c_flg(d_1, d_2) myflg_1 = d_flg(d_1, d_2) myflg_2 = IIf(myflg Or myflg_1, False, True)
If myflg_2 Then Rex.Pattern = "\D+" c_data = Rex.Execute(c_data)(0) ElseIf myflg Then Rex.Pattern = ".+丁目" If Rex.test(c_data) Then c_data = Rex.Execute(c_data)(0) Else Rex.Pattern = "\D+\d+" c_data = Rex.Execute(c_data)(0) End If End If For n = 1 To UBound(tbl, 2) Step 3 If d_1 = tbl(1, n) Then For i = 3 To .Cells(Rows.Count, n).End(xlUp).Row If myflg_2 Or myflg Then If c_data = tbl(i, n) Then x(dic(d_1 & "," & d_2)(1), 1) = tbl(i, n + 1) flag = True End If ElseIf tbl(i, n) Like "*~*" Then chck_data = dic(d_1 & "," & d_2)(0) If Right(tbl(i, n), 1) = "~" Then Rex.Pattern = "^(\D+|.+丁目)(\d+)~$" md_1 = Rex.Replace(tbl(i, n), "$2") md_2 = 10000 Else Rex.Pattern = "^(\D+|.+丁目)(\d+)~(\d+)$" md_1 = Rex.Replace(tbl(i, n), "$2") md_2 = Rex.Replace(tbl(i, n), "$3") End If If chck_data >= md_1 And chck_data <= md_2 Then x(dic(d_1 & "," & d_2)(1), 1) = tbl(i, n + 1) flag = True End If End If If Right(tbl(i, n), 1) = "他" And c_data Like "*" & Left(tbl(i, n), _ Len(tbl(i, n)) - 1) & "*" Then x(dic(d_1 & "," & d_2)(1), 1) = tbl(i, n + 1) flag = True End If If flag Then Exit For
Next i If flag Then md_1 = 0: md_2 = 0: chck_data = 0 flag = False Exit For End If End If Next n
Next ky End With With Sheets("作業") .Cells(2, 4).Resize(UBound(x)) = x
End With Set dic = Nothing Set Rex = Nothing End Sub Private Function c_flg(ByVal d_1 As String, ByVal d_2 As String) As Boolean c_flg = False
With CreateObject("vbscript.regexp") .Pattern = "^(厚木|綾瀬|海老名)市(旭町|中町|落合南|小園|深谷1100|中央)" If .test(d_1 & d_2) Then c_flg = True Exit Function End If .Pattern = "^(小田原|相模原|茅ヶ崎)市(栄町\d|上鶴間\d|相模大野|東林間|淵野辺|橋本\d|東海岸北|みづき\d)" If .test(d_1 & d_2) Then c_flg = True Exit Function End If .Pattern = "^(秦野|藤沢|大和)市(下鶴間4811|中央\d|曽屋\d+丁目|藤沢\d+丁目|福田\d+丁目|福田4417)" If .test(d_1 & d_2) Then c_flg = True Exit Function End If .Pattern = "^(足柄下郡箱根)町(木賀|二の平|元箱根)\d" If .test(d_1 & d_2) Then c_flg = True Exit Function End If End With
End Function Private Function d_flg(ByVal d_1 As String, ByVal d_2 As String) As Boolean d_flg = False
With CreateObject("vbscript.regexp") .Pattern = "^(厚木|綾瀬|伊勢原|秦野|藤沢|平塚|大和)市(泉町|深谷|三宮|曽屋|藤沢|中原下宿|福田|馬入|下鶴間)\d" If .test(d_1 & d_2) Then d_flg = True .Pattern = ".+丁目" If .test(d_1 & d_2) Then d_flg = False End If Exit Function End If .Pattern = "^(愛甲郡愛川|足柄下郡箱根)町(中津|二の平)\d" If .test(d_1 & d_2) Then d_flg = True Exit Function End If End With
End Function
弥太郎さん♪ メリークリスマス☆ ありがとうございます。 とっても嬉しい クリスマスプレゼントになりました。 早速コード入れ替えます。 今日は気持ち悪くて早退してしまったので まだ 試していないのです。明日 試してみますね。 薬もらったので 明日は大丈夫だと思います。 (れいまま)
>今日は気持ち悪くて早退してしまったので それは、それは・・・お大事に。 どっかの陰から弥太郎の顔を覗いた所為で・・とかやおまへんわなぁ・・・(笑 (弥太郎)
弥太郎さん 試してみました。 遅くなってすみません。 >それと先方とのやりとり上全角がベターやと思いますんで、変数上だけで半角に変換検 索するよう書き換えときました
と言うことは、半画に変換しなくても良いということですよね。 そのままVer4を試してみました。 結果ですが・・・ ほぼ 表示されました。が・・・ [壁]_・)チラッ なんとも もうしあげにくいのですがm(。≧Д≦。)m 作業シートを半画に変換してVer1で試したほうが より多くの店所を表示しました。 弥太郎さんが 時間をかけてくださったのに・・・ o(;△;)o 半画へ変換してからもVer4を試しましたが 結果は同じでした。
どちらにも共通して店所を表示しなかったのが ○ヶ○という住所で ○ケ○と添付されてくるものです。 こればっかりは 半画変換しても表示されませんでした。 Ver1では この文字の場所1箇所だけで後はパーフェクトでした。 Ver4は13個表示されませんでした。 な〜ぜ〜??? 手の込んだほうが表示されないの???といった心境です。 全部パーフェクトでしたと嘘の報告でもと思ったのですが 悩んだけど 本当のこと書きました。 "(/へ\*) 弥太郎さん ありがとうございます。 感謝の気持ちでいっぱいです。(真実) (21時まで会社で仕事していた れいまま)
>それは、それは・・・お大事に。 ありがとうございます。今日は元気に仕事しましたw >どっかの陰から弥太郎の顔を覗いた所為で・・とかやおまへんわなぁ・・・(笑 弥太郎さんにお会いしたら元気もりもりですw 23:20追加
気になったところをもう1つ コード表示すると Private Function c_flg(ByVal d_1 As String, ByVal d_2 As String) As Boolean の場所の上に線が引かれています。 もしかして 作動していないのかも・・・? (れいまま)
>全部パーフェクトでしたと嘘の報告 は、止めておくんなはれ。乗りかかった船ですから、この件に関してはヤケクソにな ってでも仕上げますワ。(笑 一応下のコードでヶケは解消する(多分)と思うんですが、担当店一覧の松が丘とか ひばりが丘、星が丘とかは星ヶ丘などと先方から送りつけてきますんやろか? それやと、それに対応するよう加えなあきまへんもんで・・・
も一つ旭町1丁目3−4 は検索上旭町1丁目としとりますけど、旭町1−3−4等 丁目省略方で送付してくるばやいはありまへんか? (弥太郎)
Sub ReimamaVer4() Dim dic As Object, i As Long, n As Integer, Rex As Object, tbl, x, ky Dim flag As Boolean, d_1 As String, d_2 As String, chck_data As Long Dim maxrow As Long, maxcol As Integer, fnd_data As String Dim a_1 As String, a_2 As String, a_3 As Long, c_data As String Dim md_1 As Integer, md_2 As Integer, myflg As Boolean, myflg_1 As Boolean Dim myflg_2 As Boolean
Set dic = CreateObject("scripting.dictionary") Set Rex = CreateObject("vbscript.regexp")
With Sheets("作業") tbl = .Range("h2").Resize(.Range("h" & Rows.Count).End(xlUp).Row - 1) ReDim x(1 To UBound(tbl, 1), 1 To 1) With CreateObject("vbscript.regexp") On Error Resume Next For i = 1 To UBound(tbl, 1) fnd_data = StrConv(tbl(i, 1), vbNarrow) .Pattern = ".+(ケ).+" If .test(fnd_data) Then fnd_data = Replace(fnd_data, .Replace(fnd_data, "$1"), "ヶ") End If Rex.Pattern = "^(神奈川県)*(.+市|中郡|足柄上郡|.+郡.+町)(.+)" a_1 = Rex.Replace(fnd_data, "$2") a_2 = Rex.Replace(fnd_data, "$3") Rex.Pattern = "\d+" If Rex.test(a_2) Then a_3 = Rex.Execute(a_2)(0) Else a_3 = 0 End If dic(a_1 & "," & a_2) = Array(a_3, i) On Error GoTo 0 Next i End With End With With Sheets("担当店一覧") maxrow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row maxcol = .Cells.Find("番号", , , , xlByColumns, xlPrevious).Column tbl = .Range("a1").Resize(maxrow, maxcol).Value For Each ky In dic.keys d_1 = Split(ky, ",")(0) d_2 = Split(ky, ",")(1) c_data = d_2 myflg = c_flg(d_1, d_2) myflg_1 = d_flg(d_1, d_2) myflg_2 = IIf(myflg Or myflg_1, False, True)
If myflg_2 Then Rex.Pattern = "\D+" c_data = Rex.Execute(c_data)(0) ElseIf myflg Then Rex.Pattern = ".+丁目" If Rex.test(c_data) Then c_data = Rex.Execute(c_data)(0) Else Rex.Pattern = "\D+\d+" c_data = Rex.Execute(c_data)(0) End If End If For n = 1 To UBound(tbl, 2) Step 3 If d_1 = tbl(1, n) Then For i = 3 To .Cells(Rows.Count, n).End(xlUp).Row If myflg_2 Or myflg Then Rex.Pattern = ".+(ケ).+" If Rex.test(tbl(i, n)) Then tbl(i, n) = Replace(tbl(i, n), Rex.Replace(tbl(i, n), "$1"), "ヶ") End If If c_data = tbl(i, n) Then x(dic(d_1 & "," & d_2)(1), 1) = tbl(i, n + 1) flag = True End If ElseIf tbl(i, n) Like "*~*" Then chck_data = dic(d_1 & "," & d_2)(0) If Right(tbl(i, n), 1) = "~" Then Rex.Pattern = "^(\D+|.+丁目)(\d+)~$" md_1 = Rex.Replace(tbl(i, n), "$2") md_2 = 10000 Else Rex.Pattern = "^(\D+|.+丁目)(\d+)~(\d+)$" md_1 = Rex.Replace(tbl(i, n), "$2") md_2 = Rex.Replace(tbl(i, n), "$3") End If If chck_data >= md_1 And chck_data <= md_2 Then x(dic(d_1 & "," & d_2)(1), 1) = tbl(i, n + 1) flag = True End If End If If Right(tbl(i, n), 1) = "他" And c_data Like "*" & Left(tbl(i, n), _ Len(tbl(i, n)) - 1) & "*" Then x(dic(d_1 & "," & d_2)(1), 1) = tbl(i, n + 1) flag = True End If If flag Then Exit For
Next i If flag Then md_1 = 0: md_2 = 0: chck_data = 0 flag = False Exit For End If End If Next n
Next ky End With With Sheets("作業") .Cells(2, 4).Resize(UBound(x)) = x
End With Set dic = Nothing Set Rex = Nothing End Sub
弥太郎さん>。・゚((T◇T゚)゚・。オロオロ。・゚(゚T◇T))゚・。 ありがとうございます。
>も一つ旭町1丁目3−4 は検索上旭町1丁目としとりますけど、旭町1−3−4等 >丁目省略方で送付してくるばやいはありまへんか? ↑ありでございます。┏(_□_:)┓
送られてくる住所はお客様が書いたものを担当者が入力したと 思われます。 それを そのまま送ってくるのです。担当者は一人ではないと思うので 入力方法が統一されていないのだと・・・ しかも お客様によっては ○番地○と申告する方もいれば ○ー○と申告される方もいます。 なので難しいのだと思います。 (誰も 住所からマクロでお店を表示させようとしているなんて 思いもしないと思うので 住所が分かればいいくらいの記載なのです 実際 出来る人なんて れいままの会社にはシステム開発以外ほとんどいないと思われます) 早速試してみます 弥太郎さん ありがとうございます。 (れいまま)
弥太郎さん 報告です。 試してみました。 表示されない住所は 海-東梶ヶ谷 厚-上荻野 相-津久井町 藤-善行 足-松田町 大-中央 平-代官町 相-弥栄 藤-片瀬 相-田名 足-中井町 でした。 ちなみに Ver1は表示されました。 Sub reimamahanVer1() Dim dic As Object, i As Long, x, n As Integer, tbl, ky
Set dic = CreateObject("scripting.dictionary") With Sheets("担当店一覧") maxrow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row maxcol = .Cells.Find("番号", , , , xlByColumns, xlPrevious).Column tbl = .Range("a1").Resize(maxrow, maxcol).Value For n = 1 To UBound(tbl, 2) Step 3 For i = 1 To UBound(tbl, 1) If Not IsEmpty(tbl(i, n)) Then dic(StrConv(tbl(1, n), vbNarrow) & StrConv(tbl(i, n), _ vbNarrow)) = tbl(i, n + 1) End If Next i Next n End With Erase tbl With Sheets("作業") tbl = .Range("h2").Resize(.Range("h" & Rows.Count).End(xlUp).Row) ReDim x(1 To UBound(tbl, 1), 1 To 1) For Each ky In dic.keys For i = 1 To UBound(tbl, 1) data = StrConv(tbl(i, 1), vbNarrow) If data Like "*" & ky & "*" Then x(i, 1) = dic.Item(ky) End If Next i Next ky .Cells(2, 4).Resize(UBound(tbl, 1)) = x End With Set dic = Nothing
End Sub (れいまま)
どっかマクロ触りましたぁ? 当方では全て正常に拾い出しとりますがなぁ?? 念のためこんなデータ(全角)も正確に拾いまっせ。 神奈川県海老名市東梶ヶ谷5−3 神奈川県海老名市東梶ケ谷4−3 も一遍コピペしてくらはい。ヶ、ケ、は対処しとりますが 「が」とケ、ヶと同等に 扱うのには対処しとりまへん。 (弥太郎) '--------------------- Sub ReimamaVer5() Dim dic As Object, i As Long, n As Integer, Rex As Object, tbl, x, ky Dim flag As Boolean, d_1 As String, d_2 As String, chck_data As Long Dim maxrow As Long, maxcol As Integer, fnd_data As String Dim a_1 As String, a_2 As String, a_3 As Long, c_data As String Dim md_1 As Integer, md_2 As Integer, myflg As Boolean, myflg_1 As Boolean Dim myflg_2 As Boolean
Set dic = CreateObject("scripting.dictionary") Set Rex = CreateObject("vbscript.regexp")
With Sheets("作業") tbl = .Range("h2").Resize(.Range("h" & Rows.Count).End(xlUp).Row - 1) ReDim x(1 To UBound(tbl, 1), 1 To 1) With CreateObject("vbscript.regexp") On Error Resume Next For i = 1 To UBound(tbl, 1) fnd_data = StrConv(tbl(i, 1), vbNarrow) .Pattern = ".+(ケ).+" If .test(fnd_data) Then fnd_data = Replace(fnd_data, .Replace(fnd_data, "$1"), "ヶ") End If Rex.Pattern = "^(神奈川県)*(.+市|中郡|足柄上郡|.+郡.+町)(.+)" a_1 = Rex.Replace(fnd_data, "$2") a_2 = Rex.Replace(fnd_data, "$3") Rex.Pattern = "\d+" If Rex.test(a_2) Then a_3 = Rex.Execute(a_2)(0) Else a_3 = 0 End If dic(a_1 & "," & a_2) = Array(a_3, i) On Error GoTo 0 Next i End With End With With Sheets("担当店一覧") maxrow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row maxcol = .Cells.Find("番号", , , , xlByColumns, xlPrevious).Column tbl = .Range("a1").Resize(maxrow, maxcol).Value For Each ky In dic.keys d_1 = Split(ky, ",")(0) d_2 = Split(ky, ",")(1) c_data = d_2 myflg = c_flg(d_1, d_2) myflg_1 = d_flg(d_1, d_2) myflg_2 = IIf(myflg Or myflg_1, False, True)
If myflg_2 Then Rex.Pattern = "(\W+町)(.+)*" If Rex.test(c_data) Then c_data = Rex.Replace(c_data, "$1") Else Rex.Pattern = "\W+" c_data = Rex.Execute(c_data)(0) End If ElseIf myflg Then Rex.Pattern = ".+丁目" If Rex.test(c_data) Then c_data = Rex.Execute(c_data)(0) Else Rex.Pattern = "\D+\d+" c_data = Rex.Execute(c_data)(0) End If End If For n = 1 To UBound(tbl, 2) Step 3 If d_1 = tbl(1, n) Then For i = 3 To .Cells(Rows.Count, n).End(xlUp).Row If myflg_2 Or myflg Then Rex.Pattern = ".+(ケ).+" If Rex.test(tbl(i, n)) Then tbl(i, n) = Replace(tbl(i, n), Rex.Replace(tbl(i, n), "$1"), "ヶ") End If If c_data = tbl(i, n) Then x(dic(d_1 & "," & d_2)(1), 1) = tbl(i, n + 1) flag = True End If ElseIf tbl(i, n) Like "*~*" Then chck_data = dic(d_1 & "," & d_2)(0) If Right(tbl(i, n), 1) = "~" Then Rex.Pattern = "^(\D+|.+丁目)(\d+)~$" md_1 = Rex.Replace(tbl(i, n), "$2") md_2 = 10000 Else Rex.Pattern = "^(\D+|.+丁目)(\d+)~(\d+)$" md_1 = Rex.Replace(tbl(i, n), "$2") md_2 = Rex.Replace(tbl(i, n), "$3") End If If chck_data >= md_1 And chck_data <= md_2 Then x(dic(d_1 & "," & d_2)(1), 1) = tbl(i, n + 1) flag = True End If End If If Right(tbl(i, n), 1) = "他" And c_data Like "*" & Left(tbl(i, n), _ Len(tbl(i, n)) - 1) & "*" Then x(dic(d_1 & "," & d_2)(1), 1) = tbl(i, n + 1) flag = True End If If flag Then Exit For
Next i If flag Then md_1 = 0: md_2 = 0: chck_data = 0 flag = False Exit For End If End If Next n
Next ky End With dic.removeall With Sheets("作業") .Cells(2, 4).Resize(UBound(x)) = x tbl = .Cells(2, 4).Resize(UBound(x), 5) For i = 1 To UBound(tbl, 1) If IsEmpty(tbl(i, 1)) And Not dic.exists(tbl(i, 5)) Then dic(tbl(i, 5)) = i ElseIf dic.exists(tbl(i, 5)) Then .Cells(dic.Item(tbl(i, 5)) + 1, 4) = tbl(i, 1) dic.Remove (tbl(i, 5)) End If Next i
End With Set dic = Nothing Set Rex = Nothing End Sub
'--------------------------------- ↑とは別のもんですよ。 Private Function c_flg(ByVal d_1 As String, ByVal d_2 As String) As Boolean c_flg = False
With CreateObject("vbscript.regexp") .Pattern = "^(厚木|綾瀬|海老名)市(旭町|中町|落合南|小園|深谷1100|中央)" If .test(d_1 & d_2) Then c_flg = True Exit Function End If .Pattern = "^(小田原|相模原|茅ヶ崎)市(栄町\d|上鶴間\d|相模大野|東林間|淵野辺|橋本\d|東海岸北|みづき\d)" If .test(d_1 & d_2) Then c_flg = True Exit Function End If .Pattern = "^(秦野|藤沢|大和)市(下鶴間4811|中央\d|曽屋\d+丁目|藤沢\d+丁目|福田\d+丁目|福田4417)" If .test(d_1 & d_2) Then c_flg = True Exit Function End If .Pattern = "^(足柄下郡箱根)町(木賀|二の平|元箱根)\d" If .test(d_1 & d_2) Then c_flg = True Exit Function End If End With
End Function '------------------------------------ '↑とは別のもんですよ。 Private Function d_flg(ByVal d_1 As String, ByVal d_2 As String) As Boolean d_flg = False
With CreateObject("vbscript.regexp") .Pattern = "^(厚木|綾瀬|伊勢原|秦野|藤沢|平塚|大和)市(泉町|深谷|三宮|曽屋|藤沢|中原下宿|福田|馬入|下鶴間)\d" If .test(d_1 & d_2) Then d_flg = True .Pattern = ".+丁目" If .test(d_1 & d_2) Then d_flg = False End If Exit Function End If .Pattern = "^(愛甲郡愛川|足柄下郡箱根)町(中津|二の平)\d" If .test(d_1 & d_2) Then d_flg = True Exit Function End If End With
End Function
マクロいじらないですけど・・・
質問です。 別のものはどうやって作動したらいいのでしょうか? (れいまま)
作動はしまへん。 必要な時に本マクロから覗きに参上して必要なデータを持ち帰ります。 c_flgは丁目で検索する資料になっとります(結果はTrueとFalseで) d_flgは〜の有る無しを判断します。要するにこのマクロにひっついた関数みたいな もんですわ。 例えば厚 - 旭町3丁目はc_flgはTrueで、c_flgはFalseを、泉町はc_flg=False,d_flg =Trueを、また東梶ヶ谷は両方に属しまへんからc_flgもd_flgもFalseで処理されるん ですワ。 (弥太郎)
う〜ん・・・ やはり表示されないないのです。 なぜ??? 海-東柏ケ谷 も表示されないです・・・ (れいまま)
ほならあそこへUPしときますワ。あれで試してみてくらはい。 (弥太郎)
ありがとうございます。 同じのUPしましたので 弥太郎さんお試しください。 (れいまま)
224 神奈川県海老名市東柏ケ谷6丁目13− 224 神奈川県海老名市東柏ケ谷3丁目4− 019 神奈川県厚木市上荻野4260 神奈川県相模原市津久井町長竹1785−1 神奈川県藤沢市善行1− 035 神奈川県藤沢市善行1− 神奈川県足柄上郡松田町神山25− 神奈川県大和市中央6丁目8− 520 神奈川県大和市中央6丁目8− 140 神奈川県平塚市代官町35− 608 神奈川県相模原市弥栄2丁目16− 011 神奈川県藤沢市片瀬5丁目2− 564 神奈川県相模原市田名5581 神奈川県足柄上郡中井町井ノ口1574ー 結果は以上ですワ。 津久井町長竹は津久井町の後数値で検索しとりますから(中井町、松田町も同じ)一致 しまへん。 善行は同一住所ですから一つしか拾いまへん。同一住所に2回に分けて発送するのは 非現実的ですわなぁ。2個口とか3個口で事足りますからなぁ。 善行1−2 善行1−3と入力して試すとお分かりになろうかと おもわれます。中央6丁目8も同じ事が言えます。 ところで、実際に松田町神山とか中井町井ノ口とかが(町の後が数値でない)拾えない のは考えてみますワ。 (弥太郎)
そうそう、その同一住所が頻繁にあるんなら空のセルを検索してそこを埋めるマクロを 追加してもよろしいで。 (弥太郎)
弥太郎さん>ありがとうございます。 一回に発送なのですが 同じ名前・住所で伝票番号違いが沢山あるのです。 Ver1で拾ってくれるのとは なにが違うのでしょうか? (れいまま) 衝突してしまいましたw 頻繁にあります。 ぜひ お願いします。
広告の住所とかひろって 架空のでまた 試してみます。 実物データーは会社から持ち出せないので・・・ ↑ 適当にいれた住所ですが 実際の方いらしたらごめんなさいね。
もう一回ようくみたら 表示されないのは重複しているやつですね。 ↑ 説明納得しました。 (れいまま)
↑にVer5として中井町井ノ口云々を対処、同住所も拾うよう変更しときました。 また、アラ捜してくらはい。 Ver1との違いは検索方法を逆にして空振りをなくしたんですワ。あれ、〜とか 他とか に対応しとりまへんで、あくまで曖昧検索ですから100%はとても無理です。 えらいコードが長くなってしまいましたなぁ(笑 完全主義者はつらい・・・(弥太郎)
弥太郎さん♥ ありがとうございます。 弥太郎さんを独占した気分で とってもいい気持ちです(笑 これから 日々作業をするなかで 何か不具合が生じたら ぜひ お願いします。 れいままにはレベル高すぎて このマクロ理解できないです・・・(汗 今からケーキを買いに行きます。 クリスマスは具合悪くて食べれなかったのでw 夕飯食べてから試します。 ありがとうございます。 (れいまま) そうそう、 明日朝礼当番が回ってくることになりました。 あの日が昇る〜の話させていただきますw
>弥太郎さんを独占した気分で とってもいい気持ちです(笑 そ・そんな〜 σ(^o^;)の、ししょ〜ですねんでぇw 試しに作ってみました。 が、時間がかかるようです。。。 まぁ、勉強って事でwww Sub test() Dim MyDic As Object Dim MyA As Variant, MyAry() As Variant Dim MyAd As String, AdKey As String Dim i As Long, n As Long, c As Long Dim ad_1 As Integer, ad_2 As Integer On Error Resume Next With Worksheets("担当店一覧") Set MyDic = CreateObject("Scripting.Dictionary") For n = 1 To .Cells(1, .Columns.Count).End(xlToLeft).Column Step 3 MyA = .Range(.Cells(1, n), .Cells(.Cells(.Rows.Count, n).End(xlUp).Row, n + 2)) For i = 3 To UBound(MyA, 1) MyAd = StrConv(MyA(i, 1), vbNarrow) With CreateObject("VBScript.RegEXP") .Pattern = "^(.+)(\d+)~(\d+)$" If .test(MyAd) Then ad_1 = .Replace(MyAd, "$2") ad_2 = .Replace(MyAd, "$3") For c = ad_1 To ad_2 MyDic(MyA(1, 1) & .Replace(MyAd, "$1") & c) = MyA(i, 2) Next c Else MyDic(MyA(1, 1) & MyA(i, 1)) = MyA(i, 2) End If End With Next i Next n End With ReDim MyAry(1 To MyDic.Count, 1 To 2) With Worksheets("作業") MyA = .Range("H2", .Range("H" & Rows.Count).End(xlUp)) ReDim MyAry(1 To UBound(MyA, 1), 1 To 1) For i = 1 To UBound(MyA, 1) With CreateObject("VBScript.RegEXP") AdKey = StrConv(MyA(i, 1), vbNarrow) .Pattern = ".+(ケ).+" If .test(StrConv(MyA(i, 1), vbNarrow)) Then AdKey = Replace(AdKey, "ケ", "ヶ") End If If MyA(i, 1) Like "*丁目*" Then .Pattern = "^(神奈川県){0,1}(.+丁目).*$" AdKey = .Replace(AdKey, "$2") Else .Pattern = "^(神奈川県){0,1}(\D+)\d*(-\d){0,1}$" AdKey = .Replace(AdKey, "$2") End If If Not MyDic.Exists(AdKey) Then .Pattern = "^(神奈川県){0,1}(\D+)\d+.*$" AdKey = .Replace(AdKey, "$2") End If Do While Not MyDic.Exists(AdKey) AdKey = Mid$(AdKey, 1, Len(AdKey) - 1) Loop End With MyAry(i, 1) = MyDic.Item(AdKey) Next i .Range("D2").Resize(UBound(MyAry, 1)) = MyAry() End With Set MyDic = Nothing Erase MyA, MyAry End Sub (キリキ)(〃⌒o⌒)b
まっ、せんせぇったらイヤですわ〜、パタンなんておめかししちゃって、ゴホンゴホン あ、いや、酔うてまへんでぇ、酔うてまへん、ハイ、ふ〜っ・・・。 ところでれいままさん、明日は待望の朝礼当番みたいでんなぁ。 突っ込まれないよう予備知識として http://search.yahoo.co.jp/search?p=%C6%FC%A4%CF%CB%F4%BE%BA%A4%EB&fr=top_v2&tid=top_v2&ei=euc-jp&search.x=1 を拾い読みしときまひょ。(笑 (弥太郎)
キリキさんw>こんばんは〜 嬉しいです。れいまま作れないです・・・(尊敬) 時間はかかってもかまいません。 気持ちがとっても嬉しいです。 自分が質問したことに対して 一生懸命やってくださった全ての方に ありがとうの気持ちが必要なのだと思います。 ご飯食べてから試してみますね。 今日は買い物に行ってお財布忘れて・・・ ご飯が遅くなってしまいました
弥太郎さん> 本のことをおっしゃりたいのかしら? 日はまた昇るって本ありましたよね?たしか・・・
話かわって Ver5の件ですが 同じのが空白だったような・・・ ご飯の支度しながら試したので(汗 あとでゆっくり見てみます。
れいままも いつか弟子入りさせてください(笑 そしたら とりっこにならい?(笑 (れいまま)
キリキさんw 実物で試してみましたw 近隣の営業所で試しました。 コメントが出てきました。 やはりエラーが出ましたかって。 おちゃめなコメントだと思います。 (れいまま) 弥太郎さん> Ver5確認しました。 藤-善行の重複分と 相-田名の重複分以外 全て表示されています。
ちこっと上記コード修正しました。 時間があるときに試してもらって、何が駄目か教えて〜 (キリキ)(〃⌒o⌒)b
完成間近バージョンUPしますた。 お試しあれ。 (弥太郎)
キリキさん>ありがとうございます。 了解しました。
弥太郎さん> 楽しみにしています。 早速朝礼でつっこまれました(笑 一番えらい人に二度もw (れいまま)
弥太郎さん> 。・:*:・゚★,。・:*:・゚☆ very d(*⌒▽⌒*)b good 。・:*:・゚★,。・:*:・゚☆ 完成間近バージョン実物で試しました。 0.31秒でパーフェクトですw
キリキさん>♪(*~ё~)ノ 修正コード試してみました。 ちゃんと重複分も表示されましたw ただ問題は 沢山のデーターで試すとPCが固まってしまって 応答していません・になってしまうです。 れいままのPCアップデートしていないからのようです。 なので れいままの家のPCで試すときは データーが少ないものむきのようです。 キリキさん 凄い・・・ れいままも いつか 色々作れるようになりたいです。
皆様 ご協力ありがとうございます。 (れいまま)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.