こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

excel VBAの文字列設定

VBAで繰り返し作業を行っているのですが変数と文字列の組み合わせの設定に困っています。
for ~next(変数x)で繰り返しを行い medx の文字列を検索したいのですがうまくいきません。
疑問の部分は以下の範囲です
定義 x, y, i, ro, li as integer
med1~medx までそれぞれ別の文字列(ex. med1= a med2 = b・・・ 統一性はないです)
VBA部分
If y > 1 Then
For x = 1 To y - 1

For i = 1 To 13 ←sheet数

For ro = 1 To 150 ←行
For li = 1 To 200 ←列
Worksheets("sheet" & i).Select
If InStr(Cells(ro, li), "med" & x) > 0 Then ←疑問部分 med1、med2・・・を含むかどうか
Cells(ro, li).Interior.ColorIndex = 3
Else
End If
Next
Next
Next
Next
else
end if
上のように書くと"med1"を含むかどうがになってしまい、"a"を含むかどうかになりません。
わかりにくいかもしれませんが回答どうぞお願いします。

投稿日時 - 2011-11-07 11:23:33

QNo.7118593

困ってます

質問者が選んだベストアンサー

ryakn1989さん、こんにちわ

配列を利用してはいけませんか?
利用してよいなら、仮にxが100種あるとして、

Dim med(100) As String

と定義します。そうすれば、

InStr(Cells(ro, li), "med" & x)

の部分は、

InStr(Cells(ro, li), med(x))

と書くことができますよ。

投稿日時 - 2011-11-07 12:21:02

お礼

回答ありがとうございました。
なんとかうまくいきそうです!

もっと勉強しないとだめですね、、、

投稿日時 - 2011-11-07 12:55:26

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

いくらそれしかできないからといっても,条件×シート×150行×200列の全てのセルを舐め回して巡回するのはあまりにお粗末,もとい非効率に過ぎます。

作成例:
sub macro1()
 dim i as integer, j as integer
 dim med(9)
 dim c as range
 dim c0 as string
 on error resume next

’条件入力(最大10個,途中キャンセルでそこまで)
 for i = 0 to 9
  med(i) = inputbox("what")
  if med(i) = "" then exit for
 next i

’条件巡回,シート巡回,検索(値の部分一致),処理
 for i = 0 to 9
  if med(i) = "" then exit for
  for j = 1 to 13
  with worksheets("Sheet" & j).range("A1:GR150")
   set c = .find(what:=med(i), lookin:=xlvalues, lookat:=xlpart)
   if c is nothing then exit for
   c0 = c.address
   do
    c.interior.colorindex = 3
    set c = .findnext(c)
   loop until c.address = c0
  end with
  next j
 next i
end sub

投稿日時 - 2011-11-07 12:55:00

お礼

回答ありがとうございます。
ちょうどベストアンサー選んだタイミングと入れ違いだったようで^^;

確かに非効率的でしたね、、、
もっと効率的にできるように勉強&慣れていこうとおもいます><

投稿日時 - 2011-11-07 13:17:11

ANo.3

#2 さんも書かれていますが、変数名を med1,med2・・・とせず、配列を使用して med(1),med(2)・・・とした方が扱いやすいと思います。
VBA開発では一般的に、Selectionを出来るだけ使わない事をお勧めします(^^)

Sub ex()
  Dim y    As Integer
  Dim x    As Integer
  Dim i    As Integer
  Dim ro   As Integer
  Dim li   As Integer
  Dim med(10) As String
    
  y = 0
  Do Until med(y) = "end"   'end が入力されるまで繰り返す。
    y = y + 1
    med(y) = InputBox("med" & y)
  Loop

  If y > 1 Then
    For x = 1 To y   'y-1 ⇒ y に変更しました。

      For i = 1 To 13 '←sheet数

        For ro = 1 To 150 '←行
          For li = 1 To 200 '←列
            With Worksheets("sheet" & i)
              If InStr(.Cells(ro, li).Value, med(x)) > 0 Then
                .Cells(ro, li).Interior.ColorIndex = 3
              End If
            End With
          Next
        Next
      Next
    Next
  End If
End Sub

投稿日時 - 2011-11-07 12:41:30

お礼

回答ありがとうございます。
疑問部のみならず他の部分も手直しいただきありがとうございました!

投稿日時 - 2011-11-07 12:57:00

ANo.1

シートの状態がもう少し具体的に書いてあると、分かりやすいと思いますが....。

「Like演算子を使う」がヒントになるかもしれません。
例えば
 Cells(ro,li).Value Like "med*"
 Cells(ro,li).Value Like "med[0-9]"
 Cells(ro,li).Value Like "med[0-9,a-z,A-Z]"
など。。。

投稿日時 - 2011-11-07 11:39:03

お礼

素早い回答ありがとうございます。
説明不足で申し訳ないです、、、
補足ですが、
med1~=inputbox("") で入力しています。
ですのでmedxを検索するのではなく、medxで定義された文字列を検索したいのです><

シートの状態ですが多くの商品名が入ってます。
1 商品A 商品B ・・・
2 商品C 商品D ・・・
3 商品B 商品D ・・・

投稿日時 - 2011-11-07 11:57:47

あなたにオススメの質問