![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
No.3ベストアンサー
- 回答日時:
横から失礼します
#1様の回答がすべてのような気がしますが
サンプルをいくつか作りましたので内容を確かめてみてください
配列にしたい対象列、範囲などが示されていませんので #2にあるように
ファンクションで書くべきでしょうかが、良く分からないようですので
A列の値のある最下段セルまでです
取得とDebug.Print 出力
セルに書き出す時に配列の利点を生かして出力などとしています
わざわざ一次元配列にするのはVariant配列で飛び行を一度に入れられない為でしょうか?
諄いようですが#1、2様の回答で完結されていると思いますので
BAは辞退します
サンプルについてもあくまで参考程度のものですので悪しからず
*コピーファイルなどで検証用にブックを作成して自己責任で確認してください
Sub test_01()
'配列(1列限定)一次元配列
Dim rng As Range, r As Range
Dim n As Long, i As Long
'可視セル範囲取得
Set rng = Range("A2", Cells(Rows.Count, "A").End(xlUp)).SpecialCells(xlCellTypeVisible)
'配列サイズ設定
ReDim arr(0 To rng.Count - 1)
'配列作成
For Each r In rng
arr(n) = r
n = n + 1
Next
'出力(取得)方法1
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next
'出力先行がフィルタにかかる場合フィルタ解除
If (ActiveSheet.AutoFilterMode = True) Then ActiveSheet.Range("A1").AutoFilter
'出力(取得)方法2
Cells(2, Columns.Count).End(xlToLeft).Offset(, 1).Resize(UBound(arr) + 1) _
= Application.WorksheetFunction.Transpose(arr)
End Sub
Sub test_02()
'二次元配列
Dim rng As Range, Rng1 As Range
Dim n As Long, i As Long
'可視セル範囲取得
Set rng = Range("A2", Cells(Rows.Count, "A").End(xlUp)).SpecialCells(xlCellTypeVisible)
'作業列取得
Set Rng1 = Cells(2, Columns.Count).End(xlToLeft).Offset(, 1)
'コピーにより飛び行を加工(修正)
rng.Copy Rng1
'配列(Variant)
Dim arr As Variant
'作業列(データ)を配列に代入
arr = Rng1.Resize(rng.Count)
'作業列をクリアー
Range(Rng1, Cells(Rows.Count, Rng1.Column).End(xlUp)).ClearContents
'出力(取得)方法1
For i = 1 To UBound(arr)
Debug.Print arr(i, 1)
Next
'出力先行がフィルタにかかる場合フィルタ解除
If (ActiveSheet.AutoFilterMode = True) Then ActiveSheet.Range("A1").AutoFilter
'出力(取得)方法2
Rng1.Offset(, 1).Resize(UBound(arr)) = arr
End Sub
Sub test_03()
'A列可視セルを一次元配列に
'条件分岐により可視セルを取得する方法(対象を含むセルをループ)
Dim i As Long, n As Long
Dim arr()
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
If Not Rows(i).Hidden Then
ReDim Preserve arr(n)
arr(n) = Cells(i, "A").Value
n = n + 1
End If
Next
'出力(取得)方法1
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next
End Sub
Sub test_04()
'A列可視セルを一次元配列に(更に格納条件を付加する場合)
'予め可視セル範囲を取得する方法(可視セルでループ)
Dim rng As Range, r As Range
Dim arr()
Dim n As Long, i As Long
'可視セル範囲取得
Set rng = Range("A2", Cells(Rows.Count, "A").End(xlUp)).SpecialCells(xlCellTypeVisible)
For Each r In rng
'セルの値が3文字以上なら格納
'フィルタ条件を更に違う条件を設けて取得
If Len(r.Value) >= 3 Then
ReDim Preserve arr(n)
arr(n) = r.Value
n = n + 1
End If
Next
'出力(取得)方法1
For i = LBound(arr) To UBound(arr)
Debug.Print arr(i)
Next
End Sub
コードまで丁寧にありがとうございます。
コードをどう組むか教えて頂きたかったので、
言葉だけの説明だとまだ組めるレベルではなくて。。
欲しい回答をQちゃんさんに頂けたのでベストアンサーを受け取って欲しいです。
助かりました。ありがとうございます。。
No.2
- 回答日時:
No1です。
>どのようにコーディングするのか教えてください。
No1に記載した通りなのですが・・・
以下は、一例ですが・・・
どういう使い方なのかが不明なので、関数化してあります。
配列にしたい Range を渡せば表示行のみの値を配列にして返します。
値の種類も不明なので、返される配列はバリアントの一次元配列です。
(添え字は1始まりにしてあります)
Function Column2Array(ByRef R As Range) As Variant
Dim c As Range
Dim i As Long, v()
i = 0
For Each c In R.Columns(1).Cells
If Not c.EntireRow.Hidden Then
i = i + 1
ReDim Preserve v(1 To i)
v(i) = c.Value
End If
Next c
Column2Array = v
End Function
No.1
- 回答日時:
こんばんは
一次元配列ということは、対象は一列のみと考えて良いのでしょうか?
簡単な方法は、セル範囲のValue地をまとめてバリアント変数に入れると配列として取得できますが、これで得られる結果は二次元配列になってしまいます。(一列のみでも、二次元になります)
変数 = セル範囲.Value
ただし、普通にセル範囲に対して上記を行うと非表示行も含まれてしまいますので、一旦、空き列(最終列とか)にコピペして、非表示行を無くしてから配列化するというひと手間が必要になります。
一次元配列として取得したければ、プリミティブに、セル範囲をループで順にチェックして、表示されていれば配列に加えるという方法になると思います。
あるいは、上記の方法で二次元配列に取得したものを、単純ループで一次元配列に転記するとかもないことはないでしょう。
VBAの場合、配列の添え字範囲を定義しておく必要があるので、
数が増加する毎に
ReDim Preserve
で配列数を再定義してゆく方法もありますし、事前に全体数を把握してセットしておく方法も考えらえます。
表示セルには「必ず値がある」と仮定してもよいのなら、シート関数のSUBTOTALを利用することで、事前に全体数を把握することができるでしょう。
https://learn.microsoft.com/ja-jp/office/vba/api …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
Excelのオートフィルタで抽出したものを配列で取得したい
Excel(エクセル)
-
エクセルVBAでオートフィルター最上行を取得するには
Excel(エクセル)
-
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
-
4
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
5
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
6
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
7
Offsetで可視セルだけを移動したい。
Excel(エクセル)
-
8
VBAのautofilter、criteriaの配列指定について(Excel2016)
Excel(エクセル)
-
9
複数指定セルの可視セルのみを別シートに転記するVBAについて
Visual Basic(VBA)
-
10
ExcelVBAで質問です。離れた二次元配列を一つにしたい
Visual Basic(VBA)
-
11
Excelのセルの色指定をVBAから配列を用いて効率的に行う方法はあり
Visual Basic(VBA)
-
12
エクセルVBA 配列からセルに「関数式」を一気代入したい
Visual Basic(VBA)
-
13
VBA シートをコピーする際に Copyメソッドは失敗しましたのエラーが出てしまいます
Visual Basic(VBA)
-
14
array関数で格納した配列の型を変更する
Visual Basic(VBA)
-
15
Excelのフィルター後の一番上のセルをコピーする(マクロ教えて。) Excelで5行目にフィルター
Excel(エクセル)
-
16
vba フィルター 複数条件 3つ以上 完全一致除外
Visual Basic(VBA)
-
17
オートフィルターをかけ、#N/A以外で絞込みするVBA記述をご教示ください
Excel(エクセル)
-
18
エクセルのエラーメッセージ「400」って?
Visual Basic(VBA)
-
19
もしセルが#N/A"なら~をする・・・には?"
Excel(エクセル)
-
20
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 配列に格納した値の平均の...
-
Excelのセルの色指定をVBAから...
-
表にフィルターをかけ、絞った...
-
array関数で格納した配列の型を...
-
エクセルVBA コンボボックスの...
-
[エクセル]連続する指定範囲か...
-
読み込みで一行おきに配列に格納
-
VBA Dictionaryオブジェクトの...
-
【VBA】ユーザーフォーム リス...
-
.NET - 配列変数を省略可能の引...
-
iniファイルのキーと値を取得す...
-
ExcelのINDEXとMATCH関数でスピ...
-
スプレットシートのGetTextにつ...
-
エクセルで、絶対値の平均を算...
-
配列に画像を格納
-
Vba Validationの選択状態を知...
-
[VBA]改行入りのセルの値を配列...
-
Split関数でLong配列に格納する...
-
Excelのオートフィルタで抽出し...
-
二次元配列の中の各行の要素を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelのセルの色指定をVBAから...
-
表にフィルターをかけ、絞った...
-
ExcelのINDEXとMATCH関数でスピ...
-
array関数で格納した配列の型を...
-
エクセルで、絶対値の平均を算...
-
[エクセル]連続する指定範囲か...
-
配列がとびとびである場合の書き方
-
DataSetから、DataTableを取得...
-
[VBA]改行入りのセルの値を配列...
-
VBA 配列に格納した値の平均の...
-
Split関数でLong配列に格納する...
-
iniファイルのキーと値を取得す...
-
エクセルでエラーを無視して一...
-
SUMPRODUCT関数を用いた最小値
-
VB6.0 ファイルの一括読込み
-
Excel オートフィルタのリスト...
-
INDEX(D:D,L3)の意味は?
-
Excelのオートフィルタで抽出し...
-
Dictionaryを使い4つの条件の一...
-
配列のSession格納、及び取得方...
おすすめ情報
Excelのマクロでコーディングの勉強中でして。。
詳しく知ってる方がいたら教えてください。。
ご丁寧な回答をありがとうございます。
>一次元配列ということは、対象は一列のみと考えて良いのでしょうか?
対象は、表のヘッダーから下の可変データ1行分でございます。
10行でもあれば500行というように、1行分のデータを1次元配列として変数に格納したいです。
>表示セルには「必ず値がある」
こちらは必ずしも値が全て入っているわけではありません。
>一次元配列として取得したければ、プリミティブに、セル範囲をループで順にチェックして、表示されていれば配列に加えるという方法になると思います。
こちらの内容が一番自分の中でフィットしたのですが、
どのようにコーディングするのか教えてください。
ありがとうございます。
こちらのコードはこのまま記載して実行するとできますでしょうか。。