忘れられない激○○料理

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

A 回答 (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」文なので、それに従いました。
    • good
    • 0

一例ですが、こんな感じでしょうか。



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
    • good
    • 0

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です。

この回答への補足

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

補足日時:2008/09/24 22:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報