いつもお世話になっております
下記のコードは
A B C のいずれかなら隣の列に1
D E F のいずれかなら隣の列に2
の値をいれたのですが、
型が一致しませんとエラーがでます。
まちがっているところ わかる方おしえてくれませんでしょうか
a = Array("A", "B", "C")
b = Array("D", "E", "F")
Sub fe()
Dim a, b
Dim R As Range
a = Array("A", "B", "C")
b = Array("D", "E", "F")
For Each R In Range("C2:C10")
If R.Value = a Then
R.Offset(, 1) = 1
If R.Value = b Then
R.Offset(, 1) = 2
Else
R.Offset(, 1) = "Nothing"
End If
End If
Next
End Sub
No.3ベストアンサー
- 回答日時:
少し違うと思いますよ
Range("C2:C10")は一度 比較はa, bの配列ですね
他の書き方も色々ありそうですね
Sub fe()
Dim a, b
Dim R As Range
a = Array("A", "B", "C")
b = Array("D", "E", "F")
Dim i As Long
For Each R In Range("C2:C10")
For i = LBound(a) To UBound(a)
If R.Value = a(i) Then
R.Offset(, 1) = 1
Next
For i = LBound(b) To UBound(b)
If R.Value = b(i) Then
R.Offset(, 1) = 2
Else
If R.Offset(, 1) = "" Then R.Offset(, 1) = "Nothing"
End If
End If
Next
Next
End Sub
No.5
- 回答日時:
質問文だけであれば、
Sub test()
Dim a As String, b As String
Dim r As Range
a = Join(Array("A", "B", "C"), "_")
b = Join(Array("D", "E", "F"), "_")
For Each r In Range("C2:C10")
If InStr(a, r.Value) > 0 Then r.Offset(, 1) = 1
If InStr(b, r.Value) > 0 Then r.Offset(, 1) = 2
If r.Value = "" Then r.Offset(, 1) = "Nothing"
Next
End Sub
これでも出来ますが実際の値の時イレギュラーな事態が起きるかどうか?
そればかりは検証不可ですし。
配列のインデックスNoを取得するにはVBの方でしょうね。
VBAでやるなら、
・ CreateObject("System.Collections.ArrayList")
・.IndexOf_3
これを使いこなすとか?
No.4
- 回答日時:
こんばんは
>型が一致しませんとエラーがでます。
どこでエラーが発生しているのか記述がありませんが、多分、
>If R.Value = a Then
あたりではないかと推測します。
原因は、R.Valueはセルの値(=文字だったり数値だったり)であるのに対して、変数 a は配列オブジェクトなので異なる種類のものを比較しようとしているため、ご質問のようなエラーになっています。
(ご提示のコードの変数 b も同様のことが言えます)
セル値と比較したいのであれば、配列の各要素(例えばa(1))と比較するようにすれば可能です。
一般的には、ループして比較すれば良いですが、数が3つなので
If R.Value = a(0) Or R.Value = a(1) Or R.Value = a(2) Then
のように、ベタで書いてしまっても記述できます。
VBなどであれば、Array.IndexOf 等で走査できるようですが、VBAにはそのようなメソッドはありません。
ル-プで比較するようなことが面倒であれば、最初の配列定義を連想配列(=Dictionary オブジェクト)を用いて設定しておけば、要素の中に同一のものが存在するかどうかは
DictionaryObject.Exists(探したい値)
とすることで判断が可能になります。
なお、ご質問には直接関係ありませんけれど、ご提示のコードの構成は
If 条件式1 Then
処理1
If 条件式2 Then
処理2
Else
処理3
End If
End If
というようになっていますけれど、多分、なさりたいこととは違っているのではないかと推測します。
上記では、
「条件1に合致した時に、処理1を行い、さらに条件2の判定以下を行う」
ようになっており
「条件1に合致しなければなにもしない」
という意味になります。
勝手に想像するところ、なさりたいことは
If 条件式1 Then
処理1
ElseIf 条件式2 Then
処理2
Else
処理3
End If
なのではないかと思うのですが・・?
No.1
- 回答日時:
a = Array("A", "B", "C")
b = Array("D", "E", "F")
a,bは共に配列です
If R.Value = a Then
a(要素№)が必要です bも同様
なので配列aとbで繰り返し処理が必要かな・・・
R.Offset(, 1) = "Nothing"・・・ aで入っている可能性もある?
If R.Offset(, 1) = "" Then R.Offset(, 1) = "Nothing" のような気がする
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) リストボックス セルの値を取得する 1 2022/05/21 20:47
- Visual Basic(VBA) ワークシートごとに計算結果 2 2022/04/30 22:00
- Visual Basic(VBA) excel VBA if文について 3 2022/03/27 17:42
- Excel(エクセル) EXCEL マクロで行を挿入して貼り付けようとするとエラーになる。 2 2022/05/24 09:43
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) 並べ替え、ソートの構文がわからない。 お世話になります。VBA超初心者です。 エクセルでワークシート 2 2023/06/28 21:00
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
コンボボックスのインデックス...
-
配列の要素がすべてカラかどう...
-
C#でbyte配列から画像を表示さ...
-
INPUT関数でのCSV読込がおかしい件
-
画像の座標取得
-
VB6からの移行したいけど、VB.N...
-
エクセルでXY座標に並べられた...
-
2次元配列の初期値
-
VBで重複しているデータをユニ...
-
定数配列の書き方
-
構造体配列の特定のメンバーをF...
-
DBから取得した値を配列へ代入する
-
VB.NETの配列の限界を教えてく...
-
Dir関数で読み取り順を操作でき...
-
配列の中の最大値とそのインデ...
-
Redim とEraseの違いは?
-
VBScript で ADO Streamオブジ...
-
ACCESSであえてデータを配列形...
-
複数のtextboxの処理を一括で行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
Excel2010のinputboxで複数デー...
-
vba フィルター 複数条件 3つ以...
-
C#でbyte配列から画像を表示さ...
-
配列のペースト出力結果の書式...
-
Dir関数で読み取り順を操作でき...
-
エクセルでXY座標に並べられた...
-
VBAで配列引数を値渡しできない...
-
C++で作成したDLLにVBAから配列...
-
構造体配列の特定のメンバーをF...
-
OutOfMemoryExceptionの回避策...
-
大量の変数を定義するにはどう...
-
VBAでMODE関数をつくる
-
VBScriptでCSVファイルを読み出...
-
定数配列の書き方
-
Segmentation Fault (メモリ制限?)
-
Excelのメモリ(配列)の上限は2G...
-
Redim とEraseの違いは?
-
CheckBoxの配列化
-
配列の中の最大値とそのインデ...
おすすめ情報
下記のコードだと なぜか
空白も2になってしまいます。
For Each R In Range("C3:C10")
If R.Value = "A" Or R.Value = "B" Or R.Value = "C" Then
R.Offset(, 1) = 1
Else
R.Offset(, 1) = 2
End If
Next
すみません 下記のコードで
うまくいきましたが、
可能なら下記のコードでのやり方
おしえてくれませんでしょうか
For Each R In Range("C2:C10")
For i = LBound(a) To UBound(a)
If R.Value = a(i) Then
R.Offset(, 1) = 1
Next
---------------------
For Each R In Range("C3:C10")
If R.Value = "A" Or R.Value = "B" Or R.Value = "C" Then
R.Offset(, 1) = 1
ElseIf R.Value = "D" Or R.Value = "E" Or R.Value = "F" Then
R.Offset(, 1) = 2
Else
R.Offset(, 1) = ""
End If
なぜかベントアンサー選べませんしかでません。
以前 このサイトの某氏から・ CreateObject("System.Collections.ArrayList")
・.IndexOf_3で回答得たことがあります。
今の質問と違いますが
どのように使用するか 少しだけでも
おしえてくれませんでしょうか