アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております
下記のコードは
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

質問者からの補足コメント

  • うーん・・・

    下記のコードだと なぜか
    空白も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

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/07/06 20:47
  • どう思う?

    すみません 下記のコードで
    うまくいきましたが、
    可能なら下記のコードでのやり方
    おしえてくれませんでしょうか
    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

    No.2の回答に寄せられた補足コメントです。 補足日時:2023/07/06 20:50
  • へこむわー

    なぜかベントアンサー選べませんしかでません。

    No.3の回答に寄せられた補足コメントです。 補足日時:2023/07/06 21:02
  • うーん・・・

    以前 このサイトの某氏から・ CreateObject("System.Collections.ArrayList")
    ・.IndexOf_3で回答得たことがあります。
    今の質問と違いますが
    どのように使用するか 少しだけでも
    おしえてくれませんでしょうか

    No.5の回答に寄せられた補足コメントです。 補足日時:2023/07/07 20:21

A 回答 (6件)

少し違うと思いますよ


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
この回答への補足あり
    • good
    • 0
この回答へのお礼

なるほど、ありがとうございます

お礼日時:2023/07/06 21:01

No.5です。



該当データのメンテナンス性を考えると、セルに書き出して(2列に分ける?)その範囲でワークシート関数のCountifで判定しても良いのかも。
該当データに変更等なければコード内でも良いでしょうけれど、上記の方が疑似的な配列検索とも言えると個人的には感じます。
取得する結果が有無だけで良いのならですよ。
    • good
    • 0
この回答へのお礼

Countifですね いろいろ参考になります
ありがとうございます

お礼日時:2023/07/07 20:22

質問文だけであれば、



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

これを使いこなすとか?
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2023/07/07 23:32

こんばんは



>型が一致しませんとエラーがでます。
どこでエラーが発生しているのか記述がありませんが、多分、
>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
なのではないかと思うのですが・・?
    • good
    • 1
この回答へのお礼

いつもお世話になっております
いろいろ参考になります
ありがとうございました。

お礼日時:2023/07/06 21:03

aのところの例


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
 ちなみに同じ処理を関数でやるとどうなるかな・・・
多重ループをしなくても良さそうな気がしますね・・
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2023/07/06 21:01

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" のような気がする
この回答への補足あり
    • good
    • 0
この回答へのお礼

早速ご返信ありがとうございます
何か別の方法はありますでしょぅか

お礼日時:2023/07/06 20:38

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