Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2013)
一行目の項目の中の、特定語句のn番目のColumnsを特定したい。
投稿日時: 20/02/14 11:31:10
投稿者: OkabeS

 
特定語句が複数回登場します。
その語句が1回目、2回目〜(5回目位まで)に登場する「列」が何番目なのか
吐き出したいです。
おそらくfor nextを使用するのかというイメージはありますが、
どのように組んだら良いか検討がつかず、教えて頂けますか?
web上に参考になる情報は見つけられませんでした。
 
例)
A  B  C  D E F
あ い  a b a a
 
 
以下列数を特定したい。
・a1回目 → 3列目
・a2回目 → 5列目
・a3回目 → 6列目

回答
投稿日時: 20/02/15 09:37:32
投稿者: takesi

いくつかありますね。
 
Private Sub CommandButton1_Click()
Dim Rng_set As Range
Dim findSTR As String
findSTR = "a"
 
For Each Rng_set In Range("A1:F1")
    '定数と完全一致
    If Rng_set.Value = findSTR Then Debug.Print Rng_set.Column
    '定数と部分一致
    If InStr(Rng_set.Value, findSTR) > 0 Then Debug.Print Rng_set.Column
Next
End Sub
 
Private Sub CommandButton2_Click()
Dim Rng_set As Range
Dim findSTR As String
Dim Cmn_num As Integer
findSTR = "a"
 
For Cmn_num = 1 To 6
    '定数と完全一致
    If Cells(1, Cmn_num).Value = findSTR Then Debug.Print Cmn_num
    '定数と部分一致
    If InStr(Cells(1, Cmn_num).Value, findSTR) > 0 Then Debug.Print Cmn_num
Next
End Sub

回答
投稿日時: 20/02/15 15:08:11
投稿者: WinArrow
投稿者のウェブサイトに移動

For ル^プで全部を探すのは、無駄なような気がします。
 
ヒットするセルだけを探すには、FINDメソッドがあります。
 
⇓のコードは参考です。
自分でアレンジして、お使いください。
 
Sub test()
Dim FindMoji As String
Dim FirstAddress As String, FindCell As Range
 
    FindMoji = "a"
    With ActiveSheet
        With .UsedRange
            Set FindCell = .Find(what:=FindMoji)
            If Not FindCell Is Nothing Then
                FirstAddress = FindCell.Address
                Do
                    Debug.Print FindCell.Address
                    Set FindCell = .FindNext(FindCell)
                Loop Until FirstAddress = FindCell.Address
            End If
        End With
    End With
         
End Sub

回答
投稿日時: 20/02/15 15:28:17
投稿者: simple

既に回答が提示されていますが、(Findは現時点でちょっと難しいかも)
こういう書き方もあるということで。(takesiさんと同じと言えば同じです)

Sub test()
    Dim k As Long
    Dim j As Long
    Dim s As String
    
    s = "a"     '検索文字列
    For k = 1 To Cells(1, Columns.Count).End(xlToLeft).Column  '対象範囲は最終列まで
        If Cells(1, k).Value = s Then
            j = j + 1
            Debug.Print j & "番目の一致は、" & k & "列目"
        End If
    Next
End Sub

以下、雑談です。
>web上に参考になる情報は見つけられませんでした。
まったく同一のコードなんかいくら探してもありません。
しかし、繰り返しの構文の例は山ほどあるはずです。
 
繰り返し処理はマクロ記録ではできないことの代表例のひとつですから、
どんなテキストでも、かなり最初のほうで説明されませんか?
それを適用していく練習をしていけばいいのです。
詰まっているのであれば、どこにつまっているのか、よくよく考えた方がよいです。
そこを集中して補強するのです。
 
そうは言っても、最初から、理屈で押していける人は少ないです。
"習うより慣れよ"であって、たくさんの例にあたることです。
今回の質問もその一過程でしょう。
できるだけ積極的に反応して、経験値を増やすことです。
 
存外障害になりやすいのは、セルをどう指定したらいいか、という点でしょう。
以下のスレッドは有益です。色々な指定方法が列挙されています。
折りに触れて確認すると良いでしょう。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_cell.html
(ちなみに、確認のためか、逐一Selectしていますが、普通Selectはしません。)
 
自分自身中級のくせに妙な方向に話が行きました。失礼。
 
# 質問の当日直ぐに回答がありましたが、質問者の反応がなかったので(たぶん)、消されました。
# 僭越ながら、私も気持ちがよくわかります。折角回答しても放置されると、気持ちが萎えます。
# なんだい質問しておいて、要らないなら質問しないでくれ、と。
#
# 不明点があるなら、すぐに、このあたりもう少し教えて、と返した方がいい。
# 時間が経つにつれて反応しにくくなる。
# いくつか回答があるまで待ってから、というのが最悪です。
# 最初の回答で尽きているケースもあります。

回答
投稿日時: 20/02/15 18:22:32
投稿者: WinArrow
投稿者のウェブサイトに移動

余計なお世話かもしれませんが・・・・
  
単純に「n」個目の「列」を取得で終わりではないですよね?
 列を取得する目的(その列をどのように使うのか?)で、どのような方法で探せばよいかが、
 決まることがあるので、そのあたりも説明するとよいでしょうね・・・・

投稿日時: 20/02/16 14:11:50
投稿者: OkabeS

takesi様
WinArrow様
simple様
 
早速のご対応ありがとうございました。
時間を割いて頂いたのにお返事が遅れまして申し訳ありません。
すぐにご回答頂いた方に失礼もあり、大変申し訳ありませんでした。
 
頂いたご回答で解決することが出来ました。
また、その他アドバイスも頂きありがとうございます。
コードの意味を噛み砕いて、実際の実務で発展させたいと思います。
この後、特定の列に更に処理をかけていきます。
 
以上ありがとうございました。