質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

661閲覧

match関数の検索値が○○1,○○10等、文字と数値の時に○○1のセルに○○10が上書きされないようにしたい。

shibakoppe

総合スコア35

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2023/02/07 00:19

編集2023/02/07 02:45

実現したいこと

match関数を用いた条件検索をしているのですが、
○○1、○○2、……、○○80という条件で表を作成している中で、
○○10以降が検索条件に上がってこないため、
○○10、……、○○80までが検索条件として該当するようにしたい。

前提

以前皆様のお力をお借りし、2列でまとめられているExcelの表から、
該当する文字列を検索条件として、複数列の表に変換するマクロを使用しています。

発生している問題・エラーメッセージ

検索条件に○○1、○○2、……、○○80という文字+数値の形の文言を使用しているのですが、○○10以降が○○1のセルに上書きされてしまい、正しく抽出することができません。
また、○○10も抽出が上手くできておらず、文字の後の数字が2桁になると、1桁目のみ判断されてしまっている為、○○10以降が正しいセルへと抽出されません。

該当のソースコード

vba

1Sub転記と並び替え() 2 Dim ws1 As Worksheet 3 Set ws1 = Sheets("1") 4 Dim ws2 As Worksheet 5 Set ws2 = Sheets("2") 6 7 Dim i As Long, r As Long, c As Long 8 With ws1 9 On Error Resume Next 10 For i = 2 To .Range("B" & Rows.Count).End(xlUp).Row 11 r = WorksheetFunction.Match(.Cells(i, 1), ws2.Range("A:A"), 0) 12 If Err.Number = 0 Then 13 c = MyMatch(.Cells(i, 2), Array("○○ 1", "○○ 2", "○○ 3", "○○ 4", "○○ 5", "○○ 6", "○○ 7", "○○ 8", "○○ 9", "○○ 10", _ 14 "○○ 11", "○○ 12", "○○ 13", "○○ 14", "○○ 15", "○○ 16", "○○ 17", "○○ 18", "○○ 19", "○○ 20", _ 15 "○○ 21", "○○ 22", "○○ 23", "○○ 24", "○○ 25", "○○ 26", "○○ 27", "○○ 28", "○○ 29", "○○ 30", _ 16 "○○ 31", "○○ 32", "○○ 33", "○○ 34", "○○ 35", "○○ 36", "○○ 37", "○○ 38", "○○ 39", "○○ 40", _ 17 "○○ 41", "○○ 42", "○○ 43", "○○ 44", "○○ 45", "○○ 46", "○○ 47", "○○ 48", "○○ 49", "○○ 50", _ 18 "○○ 51", "○○ 52", "○○ 53", "○○ 54", "○○ 55", "○○ 56", "○○ 57", "○○ 58", "○○ 59", "○○ 60", _ 19 "○○ 61", "○○ 62", "○○ 63", "○○ 64", "○○ 65", "○○ 66", "○○ 67", "○○ 68", "○○ 69", "○○ 70", _ 20 "○○ 71", "○○ 72", "○○ 73", "○○ 74", "○○ 75", "○○ 76", "○○ 77", "○○ 78", "○○ 79", "○○ 80")) 21 If c > 0 Then ws2.Cells(r, c + 1).Value = .Cells(i, 2) 22 End If 23 Next 24 On Error GoTo 0 25 End With 26End Sub 27 28Public Function MyMatch(v As String, ary) As Long 29 Dim i As Long 30 For i = 0 To UBound(ary) 31 If v Like "*" & ary(i) & "*" Then 32 MyMatch = i + 1 33 34 35 Exit For 36 End If 37 Next 38End Function 39 40 41

「検査範囲の引数の値は、昇順の並べ替えでは、1 ~ 9、A ~ Z、あ~ん、FALSE ~ TRUE の順に配置されます。」とMicrosoftサポートには記載があったですが、
「1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20」という並びが
「1,10,11,12,13,14,15,16,17,18,19,2,20,3,4,5,6,7,8,9」として判断されてしまうということですよね…?
正しく「1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20」と認識させるにはどうすればようのでしょうか…?

数値を変えてみたりしたのですが、状況が改善されず、
お手数ですが、参考となるURLやコード等をご教授いただきたく質問させていただきました。
何卒よろしくお願い申し上げます。

※追記

tatsu99様
画像掲載させていただきます。
分かりにくくて申し訳ございません。
※シート2の一部表記が間違っていましたので、修正したものを再掲載させていただきました。

シート1
イメージ説明

上記コードのまま使用すると
シート2
イメージ説明

となってしまうのですが、正しくは下記のようにしたいです。

期待するシート2の形
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tatsu99

2023/02/07 02:00 編集

各シートのレイアウトと内容が判りません。 実行前のシート1,シート2の内容と 実行後の期待するシート2の内容を提示していただけませんでしょうか。 画像で提示していただけると判りやすいです。
shibakoppe

2023/02/07 02:08

コメントいただき、誠にありがとうございます。 画像でとのことでしたが、表として掲載してしまいました…。 分かりにくいかもしれないのですが、画像で再度掲載させていただいたほうがよろしいでしょうか?
tatsu99

2023/02/07 02:11

13行目 cc = MyMatch(.Cells(i, 2), Array(..... のccですが、 c = MyMatch(.Cells(i, 2), Array(..... の誤りではないでしょうか。
tatsu99

2023/02/07 02:14

>画像でとのことでしたが、表として掲載してしまいました…。 >分かりにくいかもしれないのですが、画像で再度掲載させていただいたほうがよろしいでしょうか? こちらでも、提示されたマクロを動かして確認したいので、その為の情報が欲しいためリクエストしています。表でも各セルのレイアウト及び内容が判るならそれで、構いませんが、現在は表自体が見当たりません。
shibakoppe

2023/02/07 02:16

大変失礼しました。 コピーした際にccとなってしまっていました。 ご指摘通り、c=…と記述しております。 誤解を招いてしまい、申し訳ございません。 修正させていただきます。
shibakoppe

2023/02/07 02:17

承知いたしました。 画像掲載させていただきますので、少々お時間をいただきたく思います。
shibakoppe

2023/02/07 02:27

お待たせしてしまい申し訳ございません。 画像掲載させていただきました。 ご確認いただけますと幸いです。 宜しくお願い申し上げます。
tatsu99

2023/02/07 02:41

提示された表で、状況理解できました。 対策をLikeにするか、他にするか考え中です。(Likeでは無理なような気がします) しばらくお待ちください。 画像の添付は不要です。
shibakoppe

2023/02/07 02:46

お手数をおかけしてしまい申し訳ございません。 ご考慮いただきありがとうございます。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

MyMatchの内容を変えました。逆から検索するようにしています。(長いものから検索)
この方法で、不満足な場合は、正規表現での検索方法を提案しますので、その旨返信してください。

VBA

1Public Function MyMatch(v As String, ary) As Long 2 Dim i As Long 3 For i = UBound(ary) To 0 Step -1 4 If v Like "*" & ary(i) & "*" Then 5 MyMatch = i + 1 6 7 8 Exit For 9 End If 10 Next 11End Function 12

投稿2023/02/07 03:14

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shibakoppe

2023/02/07 04:19

逆から検索する方法でこんなに変わるなんて想像もしておりませんでした。 ご丁寧に対応していただきまして誠にありがとうございました。 とても勉強になりました。 ご提示いただいたコードで、希望通りの表を作成することができました。 不満足なんて、あるはずがございません。 改めまして、この度は本当にお世話になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問