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

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

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

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

Q&A

3回答

400閲覧

VBAのセル内Valueのあいまい検索

toradora

総合スコア4

VBA

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

0グッド

0クリップ

投稿2022/06/09 09:52

ExcelVBAについて、セル内に打ち込まれた文字列の一部が同シート内のリストにある文字列の一部と一致すればピックアップするというマクロを組みたいのですが、うまくコードが思い浮かばなかったので質問させていただきます。

例えば以下のマクロの If ary(k, 2) = Cells(2, 8) Then の箇所で、ary(k,2)に"1880_1"、Cells(2,8)の箇所に"1880_2"と入力されていた場合、_前の1880が一致しているためそれをピックアップし別のセルに転記するという動作をさせたいです。

いろいろ調べたり考えたりしてみたもののいいコードが思いつかず。。
どうかご回答お願いいたします。

VBA

1Set outRng = Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp)) 2 ary = outRng 3 For k = LBound(ary) To UBound(ary) 4 If ary(k, 2) = Cells(2, 8) Then 5 Rng.Cells(k, 2).EntireRow.Copy Destination:= _ 6 Worksheets("result").Cells(ii, 1) 7 End If 8 Next

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

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

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

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

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

tatsu99

2022/06/09 13:16

不明点 1."AA1800" と "BB1800"のように途中が同じ場合は、転記対象外ですか。 2.Cells(2,8)が"1800_2"で、"1800_1"のセルと"1899"のセルがあった場合は、どちらも転記対象になりますか。
toradora

2022/06/10 09:29

説明が不明瞭で申し訳ありません。 対象のセルの値としては、"数字数桁_数字数桁"(ex.1885_63, 328350_22 等) という構成になっていて、_前が一致していればピックアップという形をとりたいです。 なので2.については、Cells(2,8)が"1800_2"であった場合、"1800_1"がピックアップ対象となり、"1899"は対象外という形になります。
guest

回答3

0

MyCompは_の直前までの文字列が一致した場合、trueを返し、そうでなければfalseを返します。
If ary(k, 2) = Cells(2, 8) Thenを
If Mycomp(ary(k, 2),Cells(2, 8)) = true then
のように変えて使ってください。

VBA

1'文字列比較(_の直前までの文字列が一致した場合、trueを返す) 2Public Function MyComp(ByVal p1 As String, ByVal p2 As String) As Boolean 3 MyComp = False 4 Dim r1 As Variant 5 Dim r2 As Variant 6 r1 = InStr(p1, "_") 7 If r1 < 2 Then Exit Function 8 r2 = InStr(p2, "_") 9 If r2 < 2 Then Exit Function 10 If r1 <> r2 Then Exit Function 11 If Left(p1, r1 - 1) <> Left(p2, r2 - 1) Then Exit Function 12 MyComp = True 13End Function 14

投稿2022/06/10 10:06

tatsu99

総合スコア5438

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

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

toradora

2022/06/15 06:40

回答ありがとうございます。 途中のIf r1 < 2 Then Exit Functionや、If r2 < 2 Then Exit Functionの箇所はなぜr1(r2) < 2であった場合exitをする処理にしているのでしょうか?
tatsu99

2022/06/15 06:58 編集

r1 < 2が成立するのは、 p1の文字列中に_が存在しない場合(r1=0) p1の文字列中の先頭が_で始まっている場合(r1=1) のケースです。この場合は、比較しても意味がないのでfalseを返します。 Exit Functionを実行すると、最初にMyComp = Falseを実行しているので、falseが呼び出し側に返ります。
toradora

2022/06/15 07:16 編集

ありがとうございます。 そのあとのIf r1 <> r2 Then Exit FunctionやIf Left(p1, r1 - 1) <> Left(p2, r2 - 1) Then Exit Functionにひっかからなかった場合のみMyComp=Trueとなり、Trueが呼び出し側に返るということですね。
tatsu99

2022/06/15 07:42

はい。そうです。
guest

0

以下は、二つの文字列を先頭から順に比較して一致しているところまでを返すFunctionの例。

Function similar(a As String, b As String) As String Dim i, x x = IIf(Len(a) < Len(b), Len(a), Len(b)) For i = 1 To x If Left(a, i) = Left(b, i) Then similar = Left(a, i) Next End Function

投稿2022/06/09 10:17

jinoji

総合スコア4585

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

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

0

例えば以下のマクロの If ary(k, 2) = Cells(2, 8) Then の箇所で、ary(k,2)に"1880_1"、Cells(2,8)の箇所に"1880_2"と入力されていた場合、_前の1880が一致しているためそれをピックアップし別のセルに転記するという動作をさせたいです。

これが、先頭一文字でも一致していたらということなら、

vba

1 If Left(ary(k, 2), 1) = Left(Cells(2, 8),1) Then

4文字目まで一致していたら、という意味なら、

vba

1 If Left(ary(k, 2),) = Left(Cells(2, 8), 4) Then

_の前まで一致していたらということなら、

vba

1 If Split(ary(k, 2) & "_", "_")(0) = Split(Cells(2, 8) & "_", "_")(0) Then

上記のどれでもないなら、もう少し明確に仕様を提示してください。

投稿2022/06/09 13:14

hatena19

総合スコア33715

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

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

toradora

2022/06/10 09:32

_の前まで一致していたらピックアップするという動作をさせたいということです。 説明不足で申し訳ありません。
hatena19

2022/06/10 11:16

それなら、私の回答の一番最後の式でいいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問