Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12197 / 13646 ツリー ←次へ | 前へ→

【11823】UBound(aa, 1)のエラーについて カド 04/3/17(水) 10:07 質問
【11824】Re:UBound(aa, 1)のエラーについて Asaki 04/3/17(水) 10:19 回答
【11827】Re:UBound(aa, 1)のエラーについて カド 04/3/17(水) 10:45 質問
【11828】Re:UBound(aa, 1)のエラーについて Asaki 04/3/17(水) 10:51 回答
【11831】Re:UBound(aa, 1)のエラーについて カド 04/3/17(水) 11:22 質問
【11833】Re:UBound(aa, 1)のエラーについて Asaki 04/3/17(水) 11:26 回答
【11837】Re:UBound(aa, 1)のエラーについて カド 04/3/17(水) 11:52 質問
【11840】Re:UBound(aa, 1)のエラーについて Asaki 04/3/17(水) 12:19 回答
【11846】Re:UBound(aa, 1)のエラーについて カド 04/3/17(水) 13:42 お礼

【11823】UBound(aa, 1)のエラーについて
質問  カド E-MAIL  - 04/3/17(水) 10:07 -

引用なし
パスワード
   先日教えていただいた ”全角を半角に変換する” 下記コードにて、

例えば、新規のBookのC列のみにデータを入力し、(要は余計なデータが無い状態)
C列を選択して実行するとエラー”エラー13、型が一致しません。”が出ることが有ります。

原因と対処方法を教えていただきたいです。


’−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Sub aaa()

  Dim i As Long
  Dim aa As Variant
  Dim bb As Range

  Set bb = Intersect(Selection, ActiveSheet.UsedRange)
 
  aa = bb.Value
 
  For i = 1 To UBound(aa, 1) ←エラーが出る
    aa(i, 1) = StrConv(aa(i, 1), vbNarrow)
  Next i
 
  bb.Value = aa
 
  Set bb = Nothing

End Sub

【11824】Re:UBound(aa, 1)のエラーについて
回答  Asaki  - 04/3/17(水) 10:19 -

引用なし
パスワード
   こんにちは。

おそらく、aa が配列になっていないためにエラーになるのだと思います。
対処法としては
1) 配列のときとそうでないときの処理を分岐する
2) 配列でないときは、無理やり配列にする

いずれも、
bb.Count=1 なら 配列でない
IsArray(aa) = False なら配列でない
という判断が出来そうです。

【11827】Re:UBound(aa, 1)のエラーについて
質問  カド E-MAIL  - 04/3/17(水) 10:45 -

引用なし
パスワード
   ▼Asaki さん 回答ありがとう御座います。

確かにエラーが出るときは、シート上にデータが一つしか無い時で、
bb.Count=1となっていました。

>対処法としては
>1) 配列のときとそうでないときの処理を分岐する
>2) 配列でないときは、無理やり配列にする

配列については不得手で良く判りません。
1)と2)のそれぞれの場合をマスターしたいので、教えていただけたら
大変ありがたいです。

【11828】Re:UBound(aa, 1)のエラーについて
回答  Asaki  - 04/3/17(水) 10:51 -

引用なし
パスワード
   1) の場合は、
If 配列のとき Then
  For 〜 Next の処理
Else
  aa = StrConv(aa, vbNarrow)
End If

2) の場合は
For 〜 Next の処理の前で、bbを使って配列かどうかをチェックし、配列でなければ、
Redim aa(1,1)
として
aa(1,1) = bb.Value
とします。

【11831】Re:UBound(aa, 1)のエラーについて
質問  カド E-MAIL  - 04/3/17(水) 11:22 -

引用なし
パスワード
   ▼Asaki さん 回答ありがとう御座います。

どちらでも出来ました。

あと肝心な質問を忘れていましたが、bb.Count=1 の場合は
どうして配列にならないのしょうか?

bb.Count=0でNGならなんとなく理解し易いのですが。。。。

【11833】Re:UBound(aa, 1)のエラーについて
回答  Asaki  - 04/3/17(水) 11:26 -

引用なし
パスワード
   >あと肝心な質問を忘れていましたが、bb.Count=1 の場合は
>どうして配列にならないのしょうか?

bb.Count
が、何を数えているか、ご理解いただけていますか?

対象セルが1つなら、配列にする意味がないのでしょう。
多分、ここは"仕様"と考えるよりほかないと思っています。

【11837】Re:UBound(aa, 1)のエラーについて
質問  カド E-MAIL  - 04/3/17(水) 11:52 -

引用なし
パスワード
   ▼Asaki さん 回答ありがとう御座います。

>bb.Count
>が、何を数えているか、ご理解いただけていますか?
理解出来ていると思っています。

>対象セルが1つなら、配列にする意味がないのでしょう。
>多分、ここは"仕様"と考えるよりほかないと思っています。

”仕様”ですね。分かりました。

ところで先ほど教えていただいた2)の場合ですが、
出来たと思っていたのですが、以下のようにしたらデータが消えてしまいました。

何が悪いのでしょうか?

’−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Sub aaa2() 'データが1行にしか無い場合

  Dim i As Long
  Dim aa As Variant
  Dim bb As Range

  Set bb = Intersect(Selection, ActiveSheet.UsedRange)
  MsgBox bb.Count
  
   ReDim aa(1, 1)
   aa(1, 1) = bb.Value
  
  For i = 1 To UBound(aa, 1)
    aa(i, 1) = "99"
  Next i
  
  bb.Value = aa

  Set bb = Nothing

End Sub

【11840】Re:UBound(aa, 1)のエラーについて
回答  Asaki  - 04/3/17(水) 12:19 -

引用なし
パスワード
   すみません。
間違ってました。

>ReDim aa(1, 1)

ReDim aa(0, 0)
または
ReDim aa(1 to 1, 1 to 1)
どちらかにしてください.

【11846】Re:UBound(aa, 1)のエラーについて
お礼  カド E-MAIL  - 04/3/17(水) 13:42 -

引用なし
パスワード
   ▼Asaki さん 何度もありがとう御座いました。

うまく行きました。

12197 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free