• ベストアンサー

下記のマクロは

E列の5行目から2000行までの間で 鉄、銅、銀、空白以外の文字が入っていたら 『鉱1_Click』という別のマクロを行うというマクロなのですが、 『銀』に限ってはE列5行目~2000行の間に1つだけあっても 『鉱1_Click』を走らせるようにしたいのですが、 どのように改造すればできると思いますか? Private Sub 鉱_Click() Dim ColumnA Dim flg As Boolean flg = False ColumnA = Columns("E:E") For i = 5 To 2000 If ColumnA(i, 1) = "鉄" Or ColumnA(i, 1) = "銅" Or ColumnA(i, 1) = "銀" Or ColumnA(i, 1) = "" Then Else flg = True Exit For End If Next If flg Then 鉱1_Click Else End If End Sub

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

  • ベストアンサー
  • Yosha
  • ベストアンサー率59% (172/287)
回答No.3

あなたのプログラムで少し気づいた点を述べて、一例として私のサンプルプログラムを書いておきます。 > Dim ColumnA > ColumnA = Columns("E:E") 変数の型を指定していないため、2行目を実行したときに、65536個(256x256、~excel2006)、1048576個(1024x1024、excel2007)の配列変数が作成さえます。 無駄が多すぎます。 また、このケースで配列変数は必要ないと思われます。 > For i = 5 To 2000 変数「i」が定義されていないので、Variantタイプの変数が自動的に作成されます。 しかし、変数を明示的に定義してないと、思わぬところでバグができやすいので、モジュールの行頭に「Option Explicit」を記述することが薦められています。 > ColumnA = Columns("E:E") > ColumnA(i, 1) VBAを使うときには、列番号も数式で扱うことが多いので、エクセルのオプションから「R1C1参照形式を使用する」にチェックを入れて使用すると便利です。 Columns("E:E") ⇒ Columns(5)、ColumnA(i, 1) ⇒ Cells(i, 1) > flg = True > If flg Then 各条件文の中で、「flg」を設定し、S/R のような形で使うより、「flg」を設定のところで直接「鉱1_Click」に飛ばしてもよいと思います。 〔サンプルプログラム〕 Private Sub 鉱_Click()  Dim r As Long, rStart As Long, rEnd As Long  ' 行に関する変数  Dim c As Integer         '列に関する変数  Dim nCountSilver As Integer  Dim s As String          '文字列に関する変数  c = 5  rStart = 5  rEnd = Cells(Rows.Count, c).End(xlUp).Row   ' データ最後の行取得  For r = rStart To rEnd    s = Cells(r, c)    If Not (s = "鉄" Or s = "銅" Or s = "") Then      If s = "銀" Then        nCountSilver = nCountSilver + 1        If nCountSilver > 1 Then          鉱1_Click          nCountSilver = 0          Exit For        End If      Else        鉱1_Click        Exit For      End If    End If  Next End Sub 注1) 「鉱1_Click」を処理した後に連続して次の鉱物を見に行くときは、IF文中の「Exit For」を削除してください。 注2) 「Rows.Count」で、そのバージョンのエクセルの全行数を取得できます。 注2) 「nCountSilver = 0」の行は、連続して次の鉱物を見に行く場合で、1度「銀」が発見された後は、見つける度に「鉱1_Click」へ飛ぶ場合は、削除してください。 なお、各種条件への分岐には、私個人としては、プログラムが見え易いという点で、Select Case 文を使いますが、Orignal が「IF」文なので、それに従いました。

その他の回答 (2)

  • goo39
  • ベストアンサー率36% (13/36)
回答No.2

一例ですが、こんな感じでしょうか。 Private Sub 鉱_Click() Dim ColumnA Dim flg As Boolean  flg = False  ColumnA = Columns("E:E")  For i = 5 To 2000   Select Case ColumnA(i, 1)    Case "鉄", "銅", ""    Case "銀"     If flg Then      鉱1_Click      Exit Sub     End If     flg = True    Case Else     鉱1_Click     Exit Sub   End Select  Next End Sub

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

If ColumnA(i, 1) = "鉄" Or ColumnA(i, 1) = "銅" Or ColumnA(i, 1) = "銀" Or ColumnA(i, 1) = "" Then から ColumnA(i, 1) = "銀" を除外する。つまり If ColumnA(i, 1) = "鉄" Or ColumnA(i, 1) = "銅" Or ColumnA(i, 1) = "" Then でOKです。

gogo545454
質問者

補足

すいません。質問の仕方が悪かったです。 『銀』に限っては2つ以上でないと作動しないという風にしたいのです。 鉄、銅、空白、銀(1つ)の状態では発動しないようにしたいです。

関連するQ&A