• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:[VBA] InStrRevとLikeの組合せ)

[VBA] InStrRevとLikeの組合せ

cj_moverの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.4

(1/2連投) こんにちは。お邪魔します。 この課題は掘り下げると色々なこと考えだして結構大変ですね。 仕様の確定までに掛かる労力が全体の8割。といった感じでしょうか。 とりあえず動くものを書いて、カットアンドトライしながら仕様確定、 って感じでやるしかないでしょうから、質問が2回以上に分かれるのも妥当ですね。 しかし何ていうか、仕様を変える度に、 コードの基本設計から変えたくなる、不思議なテーマで、結構嵌ってしまいました。 q8321600の時も当初は正規表現でサクっと簡単にできた、と思ったら、 次から次、出てくる出てくる。 とりあえず、仕様確定のヒントになるようテスト用サンプルデータです。 →マークの行は、私が仮に設定した出力パターンです。 市区町村3-1-99-101教えてマンション1号棟   →■市区町村3-1-99◆教えてマンション1号棟 101■ 市区町村3-2-99-5F教えてマンション1号棟   →■市区町村3-2-99◆教えてマンション1号棟 5F■ 市区町村3-3-99-A教えてマンション1号棟   →■市区町村3-3-99◆教えてマンション1号棟 A■ 市区町村3-4-99教えてマンション1号棟-101   →■市区町村3-4-99◆教えてマンション1号棟-101■ 市区町村3-5-99F-5OKステート   →■市区町村3-5-99◆OKステート F-5■ 市区町村3-6-99Answerビル101   →■市区町村3-6-99◆Answerビル101■ 市区町村3-7-99-101   →■市区町村3-7-99◆'101■ 市区町村3-8-99   →■市区町村3-8-99◆■ 市区町村3-9-99猫屋敷   →■市区町村3-9-99◆猫屋敷■ 市区町村2-10-101桶愚タウン   →■市区町村2-10◆桶愚タウン 101■ 市区町村2-11-101   →■市区町村2-11◆'101■ 市区町村2-12-N-101優良ヒルズ   →■市区町村2-12◆優良ヒルズ N-101■ 市区町村2-13-S-101   →■市区町村2-13◆S-101■ 市区町村2-14OKステート5F-1   →■市区町村2-14◆OKステート5F-1■ 市区町村2-99猫屋敷   →■市区町村2-99◆猫屋敷■ 市区町村2-101猫屋敷   →■市区町村2-101◆猫屋敷■ 市区町村2-102   →■市区町村2-102◆■ (空白)   →■◆■ d   →■d◆■ 1   →■1◆■ コード、というより説明コメントが厚量になってしまったので、投稿を2回に分けますが、 次の投稿で、上に挙げたような結果を返すように書いた 暫定コードを挙げてみます(仕上がってはいませんが機能はします)。 上に挙げたサンプルの中には、 "そんなのリストにないよ"とか"求める結果と違うよ"とか 過不足等はあると思います。 この回答の狙いは仕様確定のヒント、ですので、、、。 正規表現も使わず、ループも最低限にして、ベタに書きました。 MainAddressとSubAddressという風に分けて考えて 左から順番に見ていって区切り位置を決めています。 「号」の位置の先頭の数字について、 2桁以下なら「号」としてMainAddressに 3桁以上ならSubAddressの末尾に というようにしてみました。 #っつか、これがやりたくてこんなベタな書き方をしています。 「番」の位置の数字は必ず、「番」として扱います。 例示を増やしてみても、例外的な不正処理は出て来ますね。 物件名が半角英数とかだとSubAddressの整形はうまく行きませんし。 どこら辺で妥協点を見つけるか、ですけれど、 何となく感覚的に、多数をカバー出来そうと思える方法にしてみました。 その分、解り易さとか合理性とかは、あまり感じられないものになっている とは思います。 実用には、とことん追求して完成させるのもあるかも知れませんが、 もう少し仕様を緩くしたものにする方が現実的な気はしています。 (次の投稿に続きます)

関連するQ&A

  • VBAで実行時エラー'13': がでます

    初歩の初歩ですいません。 VBAで Dim A As Integer Dim B As Integer Dim C As Integer Dim gokei As Integer For i = 8 To 70 A = Cells(i, 4).Value B = Cells(i, 5).Value C = Cells(i, 6).Value goukei = A + B + C Cells(i, 7) = goukei Next i としていますが A = Cells(i, 4).Value のところで今使っているシートだと止まってしまいます。 新規でワークシートを使って仮に数字を代入すると普通に動きます。 今使っているシートもセル内には =100 と入力して 100 と表示され セルの書式設定も数値になってるんですがどうしてでしょうか?

  • VBAの得意な方、教えてください(初心者です)

    エクセルのシートが セルA1に1 セルA2に2 セルA3に3 セルA4に4 セルA5に5 という数字が入っています。 で、セルD4には"=D2*5"という数式が入っています。 セルD2にA1の数値を代入して、出てきた数値をB1に入力、 次にD2にA2の数値を代入して、出てきた数値をB2に入力…以下続く というのをVBAで書いてみたら、下のような感じになりました。 Sub test() Dim d1 As Integer Dim d2 As Integer Dim d3 As Integer Dim d4 As Integer Dim d5 As Integer Dim p1 As Integer Dim p2 As Integer Dim p3 As Integer Dim p4 As Integer Dim p5 As Integer d1 = Cells(1, 1).Value Cells(2, 4).Value = d1 p1 = Cells(4, 4).Value Cells(1, 2).Value = p1 d2 = Cells(2, 1).Value Cells(2, 4).Value = d2 p2 = Cells(4, 4).Value Cells(2, 2).Value = p2 d3 = Cells(3, 1).Value Cells(2, 4).Value = d3 p3 = Cells(4, 4).Value Cells(3, 2).Value = p3 d4 = Cells(4, 1).Value Cells(2, 4).Value = d4 p4 = Cells(4, 4).Value Cells(4, 2).Value = p4 d5 = Cells(5, 1).Value Cells(2, 4).Value = d5 p5 = Cells(4, 4).Value Cells(5, 2).Value = p5 End Sub ここで質問です。 例では5個しかないのですが、実際は100行くらいのデータなんで 大変です。もっと簡単にする方法はありますか? 実際のセルD4の数式は、他からも参照したりしているので、 ここはいじらずに教えてください。 Excel2000、Visual Basic 6.0 ってのを使っています。 よろしくお願いいたします。

  • VBAで関数を使うには?

    こんな感じだったとします。   A1      B1 2002/9/2 2002/9/3 2002/9/4 2002/9/5   : このB1にそれぞれの曜日を表示させるVBAを以下のようにしました。 Sub youbi() Dim i As Integer For i = 3 To 10 Cells(i, 3).Value = Weekday(Cells(i, 2), "aaa") Next End Sub もちろんエラーでした。 (メッセージは「型が一致しません」です。) そこで以下のように変更しました。 Sub youbi() Dim i As Integer For i = 3 To 10 Cells(i, 3).Value = "=text(Weekday(b3), ""aaa"")" Next End Sub するときちんと曜日が表示されたのですが、もちろん全部B3のセルの日付の曜日です。 ここを変数にするにはどうしたらいいのでしょうか? とっても簡単なことのように思えますが、意外とハマってしまって抜け出せません。 よろしくお願いします。

  • エクセルVBAで、特定の数字になる組み合わせを知りたいのですが・・・

    A.5380、B.4730、C.3310、D.2840、E.2360、F.1890、G.1420、H.940 以上8種類の数字を組み合わせて、合計13010ちょうどになる組み合わせをすべて知りたいです。8種類の数字は、同じものを何度組み合わせても構いません。 例えば、A+A+B=○のようにです。 色々自分なりに調べたところ、ソルバーで試してみましたが、組み合わせの数字が複雑な為か、解答はでませんでした。 また、VBAを使用して以下のような例が掲載されていたので試してみましたが、オーバーフローしてしまって答えがでません。 VBAがまったくの初心者のため、どのようにしたら問題が解消されるのかわかりません。 どなたか教えていただけませんでしょうか。お願いします。 ' knapsack総当たり ' 目標値と一致する物をすべて求める ' 'by S. Tada Const N = 8 ' データの数 Dim wa(N) As Long Sub knap_main() Dim w As Long, wmax As Long Dim i As Integer, j As Long, k As Integer Dim y1 As Integer, y2 As Integer Dim b As Long y1 = 1 ' A1:Anにデータを入れておく y2 = y1 + 1 ' B列以降が結果 For i = 1 To N wa(i) = Cells(i, y1).Value Next wmax = Cells(45, y1).Value ' A45に目標値を入れておく For j = 1 To 2 ^ N - 1 w = 0 b = 1 For k = 1 To N If j And b Then w = w + wa(k) b = b + b Next If w = wmax Then b = 1 For k = 1 To N If j And b Then Cells(k, y2).Value = wa(k) b = b + b Next y2 = y2 + 1 End If Next End Sub

  • VBAで行列を作る方法

    次のようなプログラミングで1,0,-1の要素で作られる3×3行列を全通り調べています。 この場合3の9乗通り調べることができます。 これを4×4や5×5行列など数を大きくして調べたいのですが、このプログラムを配列を使うなどして 簡単にできる方法を教えてください。 よろしくおねがいします。 Sub test() Dim a As Integer '行 Dim b As Integer '列 Dim c As Integer, i As Integer, j As Integer, d As Integer, e As Integer Dim 内積 As Integer, step As Integer Dim f As Integer, g As Integer, h As Integer, l As Integer, m As Integer, n As Integer, k As Integer, x As Integer Dim sum As Integer, total As Integer Dim aa As Integer, aaa As Integer, aaaa As Integer, bb As Integer, bbb As Integer, bbbb As Integer a = 3 '行 b = 3 '列 c = 0 内積 = 0 con = 0 sum = 0 tatal = 0 aa = 0 aaa = 0 aaaa = 0 bb = 0 bbb = 0 bbbb = 0 x = 0 For n = 0 To 2 For m = 0 To 2 For l = 0 To 2 For k = 0 To 2 For h = 0 To 2 For g = 0 To 2 For f = 0 To 2 For e = 0 To 2 For d = 0 To 2 '要素がすべて1 For i = 1 To a For j = 1 To b Cells(i, j) = 1 Next j Next i If bbbb = 1 Then Cells(a - 2, b - 2) = 0 ElseIf bbbb = 2 Then Cells(a - 2, b - 2) = -1 End If If bbb = 1 Then Cells(a - 1, b - 2) = 0 ElseIf bbb = 2 Then Cells(a - 1, b - 2) = -1 End If If bb = 1 Then Cells(a, b - 2) = 0 ElseIf bb = 2 Then Cells(a, b - 2) = -1 End If If aaaa = 1 Then Cells(a - 2, b - 1) = 0 ElseIf aaaa = 2 Then Cells(a - 2, b - 1) = -1 End If If aaa = 1 Then Cells(a - 1, b - 1) = 0 ElseIf aaa = 2 Then Cells(a - 1, b - 1) = -1 End If If aa = 1 Then Cells(a, b - 1) = 0 ElseIf aa = 2 Then Cells(a, b - 1) = -1 End If If total = 1 Then Cells(a - 2, b) = 0 ElseIf total = 2 Then Cells(a - 2, b) = -1 End If If sum = 1 Then Cells(a - 1, b) = 0 ElseIf sum = 2 Then Cells(a - 1, b) = -1 End If If con = 1 Then Cells(a, b) = 0 ElseIf con = 2 Then Cells(a, b) = -1 End If con = con + 1 Next d con = 0 sum = sum + 1 Next e sum = 0 total = total + 1 Next f total = 0 aa = aa + 1 Next g aa= 0 aaa = aaa + 1 Next h aaa = 0 aaaa = aaaa + 1 Next k aaaa = 0 bb = bb + 1 Next l bb = 0 bbb = bbb + 1 Next m bbb = 0 bbbb = bbbb + 1 Next n End Sub

  • VBA勉強中、教えてください。

    下のような表のA、B、Cの期間ごとの合計を出したいのですがうまくいきません。 マスター(sheet1)                    合計(sheet2)     A     B     C    D            A   B    C 1       商品A  商品B  商品C      1   7       合計 2  12/25   18    10    20        2  2/31   3  12/26   18    11    15        3      商品A 4  12/27   20    12    10        4      商品B    5  12/28   24    20    16        5      商品C 6  12/29   30    18    15 7  12/30   18    30    25 8  12/31   23    21    10 ユーザーフォームに日付と何日(数字入力)のフォームが作ってあります Dim i As Integer, x As Integer,dy1 As Variant,gk1 As Variant, tag1 As Variant, cnt As Integer cnt = Worksheets("合計"),Range("A1") dy1 = Application.Match(Worksheets("合計").Range("A2"), Worksheets("マスター").Range("A:A"), 0) For x = 0 To 3 tag1 = Application.Match(Worksheets("合計").Cells(3 + x, 2), Worksheets("マスター").Range("1:1"), 0) For i = 0 To cnt gk1 = gk1 + Worksheets("マスター").Cells(dy1 - i, tag1).Value Next i Worksheets("合計").Cells(2 + x, 3).Value = gk1 Next x    このようなコードにしたのですが合計がA→B→Cとすべて足されてしまいます。A,B,Cとそれぞれの合計を出すにはどのようにしたらよいのでしょうか? 思考錯誤したのですが初心者なのでよくわかりません。 どなたかわかる方が居たら教えてください。よろしくお願いします。

  • EXCEL VBA

    EXCEL VBAで空白行が現れたら「小計」の文字を入力したいと思い以下のように記述しましたが、うまくいきません。どこがおかしいのか教えてください。 宜しくお願いします。 Sub write小計() Dim i As Integer Dim rowcnt As Integer rowcnt = Cells(1, 1).CurrentRegion.Rows.Count Range("B1").Select For i = 1 To rowcnt If Cells(i, 2).Value = "" Then Value = "小 計" ActiveCell.Offset(1).Select Next i End Sub

  • VBAで計算誤差がでます。 ?

    以前作成したコードを見直しています。 例えば、 A2 : 1. plat_form (5:50) A3: 2. cloud Two (4:12) の場合、マクロを実施すると B2: 0:05:50 B3: 0:04:12 と表示されました。 C列にはB列を秒([s].000)に変更後に文字列に変換した値が出るはずが 以下のように変な値になっています。 (------> の右の値は、C列をクリックしたときに数式バー表示される値です。    C2をクリックすると数式バーに「0:05:46」と表示される。    実際は、「0:05:50」のはずで350.000が正解のはずで誤差が出る?) C2: 345.600 -----> 0:05:46 C3: 259.200 -----> 0:04:19 これは、EXCELの計算誤差なのでしょうか? その場合、 正常に表示されるコードを教えて下さい。 以下のコードを参照ください。------------------ Option Explicit Sub ①時間相当の抜き出し() Dim i As Double Dim LSN As Double '処理列の個数 LSN = Cells(Rows.Count, "A").End(xlUp).Row 'B列の文字列で最後から検索して検索文字より右側を抜き出す For i = 2 To LSN Cells(i, "B") = "0:" & カッコ内の文字列を取得する(Cells(i, "A"), "(", ")") Cells(i, "C").Value = Format(Cells(i, "B"), "[s].000") Next End Sub Function カッコ内の文字列を取得する( _ 元の文字列 As String, _ Optional 開くカッコ As String = "(", _ Optional 閉じカッコ As String = ")") _ As String Dim pos_a As Long ' 開くカッコの位置 Dim pos_z As Long ' 閉じカッコの位置 pos_a = InStr(1, 元の文字列, 開くカッコ) pos_z = InStr(pos_a + 1, 元の文字列, 閉じカッコ) カッコ内の文字列を取得する = _ Mid(元の文字列, pos_a + 1, pos_z - pos_a - 1) End Function

  • VBA Next For でのコピペについて

    EXCEL VBA初心者です。 AシートEW44からGD44までをコピーしてBというシートの最終行へコピーしたいです。 今下記のように組んでいるのですが、うまく作動しません。 Private Sub CommandButton1_Click() Dim i As Integer For i = 153 To 186 row1 = Worksheets("B").Cells(Rows.Count, 27).End(xlUp).Row Worksheets("A").Cells(i, 44).Value = Worksheets("B").Cells(row1 + 1, 27).Value Next i End Sub アドバイスいただけませんでしょうか。

  • エクセル2019 VBAについて

    エクセル2019でVBAを使いコピーペーストの勉強中です、次の箇所(Dim i As integr)で、ユーザー定義型は定義されていませんと指摘されて止まってしまします、Sheet("データ")には3行のデータは入っています、VBA初心者のため、この後が、なかなか前に進めません、どうかよろしくおねがいします。 ********************************** Sub 練習() Dim s1 As Worksheet: Set s1 = Worksheets("請求書") Dim s2 As Worksheet: Set s2 = Worksheets("データ") Dim r1 As Integer: r1 = 18 Dim r2 As Integer: r2 = 2 { Dim i As integr } For i = 0 To 2 s1.Range(s1.Cells(r1 + i, 1), s1.Cells(r1 + i, 3)).Value = s2.Range(s2.Cells(r2 + i, 2), s2.Cells(r2 + i, 4)).Value s1.Cells(r1 + i, 4).Value = s1.sells(r1 + i, 2).Value * s1.Cells(r1 + i, 3).Value Next End Sub ***************************************