[[20250812120123]] 『Variant型配列のカウント方法』(訓練中) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『Variant型配列のカウント方法』(訓練中)

A1セル〜F4セルまで以下のようなサンプルデータを作りました。
001 A 1 2 3
002 B 4 5 6
003 C 7 8
004 D 9 10 11 12

以下のようなコードを作りました。
実行結果は思った通りなのですが、
実データで使うときには、
lngLastCol - 2
という求め方ではなく
varDataの個数分だけ
というコードにしたいです。

1行目は3
2行目は3
3行目は2
4行目は5

Variant型配列のカウント方法を調べてみたのですが、
UBound(varData)
でも
UBound(varData) - LBound(varData) + 1
でも
1しか返ってきません。
配列の数を取得する方法をご存じの方
教えていただけないでしょうか。
よろしくお願いいたします。

Sub test()

    Dim varData As Variant
    Dim lngLastCol As Long

    For lngRow = 1 To 4
        lngLastCol = Cells(lngRow, Columns.Count).End(xlToLeft).Column
        varData = Range(Cells(lngRow, "C"), Cells(lngRow, lngLastCol)).Value
        Range("C" & lngRow + 10).Resize(, lngLastCol - 2).Value = varData
    Next lngRow

End Sub

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


 二次元配列の場合 UBound(varData, 2)
(jindon) 2025/08/12(火) 12:22:47

 既に適切な回答がありました。追記します。

 UBOUND関数のヘルプをよく読まれることですね。(UBOUNDの上にカーソルを置いてF1キーを押します)
 dimension引数の意味を調べて下さい。
(xyz) 2025/08/12(火) 12:35:18

 配列の要素数の取得方法については、お二人のご回答を参考に勉強していただくとして、
 今回の場合「別に配列を使用せずとも・・・」と思いました。 ↓一案としてご参考。

 Sub test2()
    Dim DataRange As Range
    Dim lngLastCol As Long
    Dim lngRow As Long

    For lngRow = 1 To 4
        lngLastCol = Cells(lngRow, Columns.Count).End(xlToLeft).Column
        Set DataRange = Range(Cells(lngRow, "C"), Cells(lngRow, lngLastCol))
        DataRange.Offset(10).Value = DataRange.Value
    Next lngRow
 End Sub
(ん〜) 2025/08/12(火) 17:09:48

 質問者さんは、1行分を配列にしているのだから、一次元配列になると勘違いされていませんか?
 矩形状に連続したセル範囲を指定して配列に格納する場合、
 1行(又は1列)だとしても二次元配列になります。
(unknown) 2025/08/12(火) 17:47:55

皆様、ご回答ありがとうございます。

UBound(varData, 2)でできました。

頭が悪くてすみません。
varDataは
1行目ならC1セル〜E1セルまでが配列になるのではと思ったのです。

varData(1 to 3)
みたいに。。。

なのでUbound(varData) ※Ubound(varData, 1)の1を省略
で行けるかなと思ったのですが、1しか返ってきませんでした。

ネットで調べて
UBound(varData) - LBound(varData) + 1
でも1しか返ってきませんでした。

>1行分を配列にしているのだから、一次元配列になると勘違いされていませんか?
まさに仰る通りです。

varDataをローカルウインドで確認したところ、
varData(1 to 1, 1 to 3)
となっていました。

(1 to 1, 1 to 3)になっているのなら、
Demensionに2を入れる事で
3が返ってくるのはわかるのですが、
1 to 1の部分が、なぜできるのか、
どういうことなのか理解できません。

申し訳ありませんが、この部分の解説も頂けないでしょうか。
追加質問になりますが、
何卒よろしくお願いいたします。

(訓練中) 2025/08/12(火) 19:06:15


 これはシートの範囲が元々二次元配列構造になっているからだと思います。
 連続した2セル以上のデータを配列に格納した場合、その範囲が一列又は一行のみでも二次元配列になります。
(jindon) 2025/08/12(火) 20:18:40

ご回答ありがとうございます。
少しわかった気がします。

つまり、
縦方向に1 to 1
横方向に1 to 3
になるってことですね。

そして、
縦方向が1つ目のDemension
横方向が2つ目のDemension
になるのですね。

改めにご回答くださった皆様に感謝いたします。

(訓練中) 2025/08/12(火) 20:33:17


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.