
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
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」文なので、それに従いました。
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
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です。
この回答への補足
すいません。質問の仕方が悪かったです。
『銀』に限っては2つ以上でないと作動しないという風にしたいのです。
鉄、銅、空白、銀(1つ)の状態では発動しないようにしたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
おすすめ情報