
Excel VBAでコーディングしていますが
行き詰っているのでお助け下さい。
(1)二次元配列に格納されている値の中から
特定の値が格納されている位置をループを使わず
取得したいのですがその方法が分かりません。
<例>
Dim x(2,2) As Valiant
x(0,0) = "あああ"
x(0,1) = "いいい"
x(0,2) = "ううう"
x(1,1) = "えええ"
・
・
・
この配列から"えええ"が格納されている位置をループを使わず
取得する方法を教えてください。 ⇒ 1, 1
(2)二次元配列の指定した列(?)を一次元配列に
格納する方法も重ねて教えてください。
以上、よろしくお願いします。
No.5ベストアンサー
- 回答日時:
(1)について
最低限、列のループは必要ですが、下記のコードを試して下さい。
Sub Test()
'配列セット
Dim x(2, 4) As Variant
x(0, 0) = "A": x(0, 1) = "B": x(0, 2) = "C": x(0, 3) = "D": x(0, 4) = "E"
x(1, 0) = "F": x(1, 1) = "G": x(1, 2) = "H": x(1, 3) = "I": x(1, 4) = "J"
x(2, 0) = "K": x(2, 1) = "L": x(2, 2) = "M": x(2, 3) = "N": x(2, 4) = "A"
'列をループして検索
Dim i As Integer
Dim m As Long
Dim c As New Collection
On Error Resume Next
For i = 1 To UBound(x, 2) + 1
Err = 0
m = Application.Match("A", Application.Index(x, 0, i), False)
If Err = 0 Then c.Add i & "," & m
Next
On Error GoTo 0
'結果表示
For i = 1 To c.Count
If MsgBox("列,行=" & c(i), vbInformation + vbOKCancel, i & "/" & c.Count) = vbCancel Then Exit For
Next
End Sub
お礼が遅くなり申し訳ありません。
上記の方法を利用したところ
思う通りのパフォーマンスを実現出来ました。
アドバイスありがとうございます。
No.4
- 回答日時:
(1) について。
> 二次元配列に格納されている値の中から特定の値が格納されている
> 位置をループを使わず取得したい
無理ですね...
現状のコードは? もともとの配列はどのように生成しているのですか?
配列のソースがセルなら Find が使えますし...データソースによっては
改善策があるかも。
(2) について。
> 配列が100×20,000と大きな配列なので...
20,000項目のデータが100レコードとは考えにくいので、
100項目のデータが20,000レコードと考えてよろしいですか?
ワークシート関数を VBA で利用します。
書式) Application.Index(配列, RowIndex, ColumnIndex)
Sub Sample()
Dim Buf(20000, 100) As Variant
Dim Array2D As Variant
Dim Array1D As Variant
' // サンプルデータをセット
Buf(20000, 100) = "TEST"
' // Index 関数で100列目を切り抜く
' // ※ 1オリジンで考え、ColumnIndex には101を指定
Array2D = Application.Index(Buf, 0, 101)
' // Index 関数により1列のみの2次元配列となる
MsgBox Array2D(20001, 1)
' // これをさらに Transpose 関数で1次元配列化
Array1D = Application.Transpose(Array2D)
MsgBox Array1D(20001)
End Sub
ただし、Index 関数の制約で Excel2000 の場合、要素数が5461個
までの配列にしか使えません。Excel2002 以降ではこの制限が大幅
に改善されましたが...
なお、Index 関数で切り抜かれる配列はソース配列が 0 オリジンで
あっても必ず 1 オリジンになります。これは Index 関数がワーク
シート関数であるが故です。
※ RowIndex も ColumnIndex も 1 から始まる。
お礼が遅くなり申し訳ありません。
教えて頂いた方法で
二次元配列を一次元配列に格納することが出来ました。
ありがとうございます。
No.3
- 回答日時:
こんばんは。
>この配列から"えええ"が格納されている位置をループを使わず取得する方法を教えてください。 ⇒ 1, 1
純粋に、プログラムで解決するなら、ループしかありません。
>本来であればOracleやせめてAccessで処理をしたいのですが
>仕様上Excelでの処理しか出来ないもので悩んでいます。
元のデータは何かにもよりますね。Excelからでも、ADO は、使えるはずです。
100×20,000 なら、一旦、Excelに書き出して、AdvancedFilter という方法もあります。
お礼が遅くなり申し訳ありません。
>>Excelからでも、ADO は、使えるはずです。
SOX法対応としてDBへの接続は禁止されておりまして。。。
やはり一度Excelに書き出すべきでしょうか。
No.2
- 回答日時:
No.1です。
回答してから気づいたのですが、Excel2003まででは、列の最大値は256で、行の最大値は65536なので、それを超える大きさの配列ではNo.1のやり方ではできません。(Excel2007では範囲は拡張されてますが)
ループを使いたくない、ということはけっこう大きな配列なのですかね…。
ご回答ありがとうございます。
当方の環境はExcel2000なのですが、
ご推測の通り配列が100×20,000と大きな配列なので
パフォーマンスの観点からセルの利用・ループは避けたいと
考えています。
こう言った背景から、(2)の質問のようにMatch関数を
上手く使う方法もあるのかな?とも思った次第です。
本来であればOracleやせめてAccessで処理をしたいのですが
仕様上Excelでの処理しか出来ないもので悩んでいます。
引き続きご教授願えれば幸いです。
No.1
- 回答日時:
あまりスマートなやり方ではないかもしれなないですが、(1)だけ。
配列をいったんセルに格納して、Findメソッドで検索してみてはいかがでしょうか。
以下はサンプルです。dummyという名前のシートを作って、マクロを実行してみてください。dummyシートが目障りなら非表示にしておけばいいでしょう。
Sub Test()
Dim TmpRng As Range, R As Range
Dim x(2, 2) As Variant
Dim i As Integer, j As Integer
Dim SearchStr As String
x(0, 0) = "あああ"
x(0, 1) = "いいい"
x(0, 2) = "ううう"
x(1, 0) = "えええ"
x(1, 1) = "おおお"
x(1, 2) = "かかか"
x(2, 0) = "ききき"
x(2, 1) = "くくく"
x(2, 2) = "けけけ"
SearchStr = InputBox("検索する文字を入力してください")
Set TmpRng = Worksheets("dummy").Cells(1, 1).Resize(3, 3) '配列を格納するセル
TmpRng.ClearContents '念のため格納先のセルをクリア
TmpRng.Value = x 'セルに配列を代入
Set R = TmpRng.Find(What:=SearchStr, LookAt:=xlWhole) 'セル範囲から値を検索
If Not R Is Nothing Then
i = R.Row - 1
j = R.Column - 1
MsgBox ("x(" & i & "," & j & ") = " & SearchStr)
Else
MsgBox ("配列xに「" & SearchStr & "」はありません")
End If
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) Sheet1のA列にコードB列にメアド、Sheet2のB列にコード一覧とD列にメアド一覧があり、Sh 3 2022/10/19 11:57
- Excel(エクセル) 格納したデータを配列のように扱う方法はありますか? 8 2023/06/05 08:53
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Visual Basic(VBA) 改行ごとに行を追加し、数量を分割 4 2023/07/11 16:39
- Ruby 初心者プログラミング 3 2022/10/12 11:31
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) VBA 検索と入力 Excel ブック ぶぶぶ シート ししし 列V 検索対象の列です 最終行は、お 6 2023/05/17 01:40
このQ&Aを見た人はこんなQ&Aも見ています
-
複数の条件に合う行番号を取得するには
その他(Microsoft Office)
-
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
-
4
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
5
配列をEraseしてもメモリが開放されていない?
Visual Basic(VBA)
-
6
配列でデータが入っている要素を求める方法
Visual Basic(VBA)
-
7
エクセルVBA 配列からセルに「関数式」を一気代入したい
Visual Basic(VBA)
-
8
VBA 1次元配列を2次元に追加する
Visual Basic(VBA)
-
9
Excel VBA のFunctionプロシージャの戻り値のエラー
Visual Basic(VBA)
-
10
エクセルVBA コードが同じでもファイルによって処理速度が大きく変わるのはなぜ
Visual Basic(VBA)
-
11
VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます
Visual Basic(VBA)
-
12
表にフィルターをかけ、絞ったデータ(可視化セルのみ)を一次元配列として変数に入れるという動作を書きた
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Rnd関数について
-
エクセル SUMPRODUCT関数でこん...
-
複数のレコードを取得する方法
-
指定数字の抽出方法
-
Ex correl関数の代用式 ?
-
Excel2000で
-
【Access】 郵便番号を検索する...
-
VBAの二次元配列?
-
ExcelのINDEXとMATCH関数でスピ...
-
エクセルで、絶対値の平均を算...
-
Excel数式
-
ヤフーファイナンス 株価時系...
-
エクセルの配列数式、配列定数...
-
複数の条件を満たすセル数の合...
-
VBAで指定期間の範囲を抽出し、...
-
Excelのセルの色指定をVBAから...
-
ListBoxへの読み込み
-
配列がとびとびである場合の書き方
-
[エクセル]連続する指定範囲か...
-
array関数で格納した配列の型を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで、絶対値の平均を算...
-
[エクセル]連続する指定範囲か...
-
表にフィルターをかけ、絞った...
-
ExcelのINDEXとMATCH関数でスピ...
-
Excelのセルの色指定をVBAから...
-
Excel オートフィルタのリスト...
-
DataSetから、DataTableを取得...
-
array関数で格納した配列の型を...
-
読み込みで一行おきに配列に格納
-
.NET - 配列変数を省略可能の引...
-
【VBA】ユーザーフォーム リス...
-
配列がとびとびである場合の書き方
-
SUMPRODUCT関数を用いた最小値
-
iniファイルのキーと値を取得す...
-
VBAでの100万行以上のデータの...
-
エクセルでエラーを無視して一...
-
配列のSession格納、及び取得方...
-
VBA 配列に格納した値の平均の...
-
VB6.0 ファイルの一括読込み
-
Datatableへの代入
おすすめ情報