「これはヤバかったな」という遅刻エピソード

d(i, 2) = Sheets(1).Range("J58")
上記を以下のAX12に変更
d(i, 2) = Sheets(1).Range("AX12")

d(i, 2) = Sheets(2).Range("J58")
上記を上記を以下のAX12に変更
d(i, 2) = Sheets(2).Range("AX12")

を変更したところ型が一致しませんと出て
If Val(d(i, 2)) = 0 Then
の部分が黄色くなってしまいます
どこを直せばいいのでしょうか


For i = 1 To cnt
If Left(d(i, 1), 1) = "G" Then
Sheets(1).Range("J5") = d(i, 1)
d(i, 2) = Sheets(1).Range("AX12")
Sheets(1).Range("J5") = ""
End If
Next

For i = 1 To cnt
If Left(d(i, 1), 1) = "T" Then
Sheets(2).Range("J5") = d(i, 1)
d(i, 2) = Sheets(2).Range("AX12")
Sheets(2).Range("J5") = ""
End If
Next

For i = 1 To cnt
For j = 4 To 48
If Sheets("集計").Cells(j, 1) = d(i, 1) Then
If Val(d(i, 2)) = 0 Then d(i, 2) = 0
Sheets("集計").Cells(j, ComboBox1 + 2) = d(i, 2)
End If
Next
Next

End Sub

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

  • うーん・・・

    ありがとうございます。
    申し訳ございません初心者で

    Val関数のパラメータは標準的には文字列なので
    Dimで宣言するところを文字型つまり
    As Stringにして治らないですか?

    ですがVBAをのせていただけないでしょうか
    申し訳ございません。

      補足日時:2024/01/20 10:23

A 回答 (5件)

詳細が分からないので違うかも知れません


また、#4様の回答に重複しますが

>d(i, 2) = Sheets(2).Range("J58")
上記を上記を以下のAX12に変更
d(i, 2) = Sheets(2).Range("AX12")

を変更したところ型が一致しませんと出て
If Val(d(i, 2)) = 0 Then
の部分が黄色くなってしまいます
どこを直せばいいのでしょうか

d(i, 2) = Sheets(2).Range("J58") でエラーが出ず
同じ変数(今回配列)に違うセル値を参照または代入し13エラーが出る場合

原因として考えられる第一候補は 参照セルの値にあります
セルの値は変数型宣言をしていない場合のVariant型や
宣言をしてのVariant型、文字列型、数値型などで受ける事が出来ますが
セルに数式などがありセル値にエラーが返っている場合

*セル値のエラーではない場合、Val 関数まで読み飛ばしてください

d(i, 2) = Sheets(1).Range("AX12") でエラーが発生しないので配列変数はVariant型だと思います

>どこを直せばいいのでしょうか

参照先セルに数式などがありシート内容を変更できる場合(理想はこちら)
関数式を見直し エラー処理関数またはエラーの原因を特定して数式を再設定するのが良いと思います

シート内容を変更できない場合は
IsError関数で分岐するとかTypeName関数で参照値などを調べ分
要件に合わせて型変換を行うとか分岐処理処理などでエラー回避処理を行う方法になると思います
Variant配列dへ代入時

If Not IsError(Sheets(2).Range("AX12").Value) Then d(i, 2) = Sheets(2).Range("AX12")

補足:上記例の(Variant)場合
代入しない場合d(i, 2)はEmptyです
Else で "" 長さ0の文字を代入すれば文字列です

Variant配列で受けて使用時に対応する場合
(コピペで作成)
For j = 4 To 48
If Sheets("集計").Cells(j, 1) = d(i, 1) Then
If Not IsError(d(i, 2)) Then
If Val(d(i, 2)) = 0 Then d(i, 2) = 0
Sheets("集計").Cells(j, ComboBox1 + 2) = d(i, 2)
End If
End If
Next


Val 関数
https://learn.microsoft.com/ja-jp/office/vba/lan …

抜粋
Val 関数は、変換前に非推奨のデータ型サフィックスを認識し、型の不一致エラーが発生する可能性があります。 たとえば、文字列 "50%" として表される 50% は予想どおりに 50 に変換されますが、割合記号は整数として宣言するサフィックスと見なされるため、Val("50.5%") はエラーを発生させます。この場合は発生しません。 データ型サフィックスの完全な一覧は、64 ビット ホストの Single ( ! ) 、Currency ( @ )、Double ( # )、String ( $ )、Integer ( % )、Long ( & )、LongLong ( ^ ) で構成されます。
    • good
    • 1

>d(i, 2) = Sheets(2).Range("J58")


>上記を上記を以下のAX12に変更
>d(i, 2) = Sheets(2).Range("AX12")

セルJ58とAX12に違いがありますか?
元に戻せば正常に動くならセルの値に問題があるのかも?
    • good
    • 0

ただちょっと違うかもしれません。


Val関数は型が一致しないエラーを起こすケースが無いみたいです。
だから思ってたのとは違うかもですけど、どっちにしろ
動作確認には先頭から全体がないと動作確認できないんです。
Subの途中からじゃ解らないです。
    • good
    • 1

逆ですよ。


貴方がコードの先頭を載せてないから
私が答えられないんです。

最後にEnd Subってあるでしょう?
最初を貴方端折ってますよね?

そこにDimで多分配列の宣言があるはずと思ってます。

そこになんて書いてるかがわからないのでコードで
答えられないんです。
    • good
    • 1

型が一致しないのですから変数の型の問題です。


ここでいうとd(i,1)っていう配列ですよね?

それを最初にdimで宣言するときに型を
多分指定してないんじゃないかな?
エラーが出ない可能性もあるなら。

Val関数のパラメータは標準的には文字列なので
Dimで宣言するところを文字型つまり
As Stringにして治らないですか?
    • good
    • 0

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


おすすめ情報