『忠犬もちしば』のAIを育てるとグッズが貰える!>>

2次元配列を作成し、コレクションにAddし、
ループで処理をしたいと考えています。

Addしたものの、取り出す方法がわかりません。
ローカルウインドウで確認すると、値が表示されているので、 test に 2次元配列は追加されているようです。


  Dim test As Collection
Set test = New Collection
Dim tmp(0, 9) As String

tmp(0, 0) = "test"
tmp(0, 1) = "56"


test.Add tmp

tmp(0, 0) = "test2"
tmp(0, 1) = "tttt"

test.Add tmp

この後 test の中の2次元配列の値をループで取り出したいです。
取り出して、セルに代入する予定です。

どうかアドバイスをお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんな感じですかね。


Sub Sample()
  Dim test As Collection
  Dim tmp(0, 9) As String
  Dim ary As Variant
  Dim i As Integer

  Set test = New Collection

  tmp(0, 0) = "test"
  tmp(0, 1) = "56"
  test.Add tmp

  tmp(0, 0) = "test2"
  tmp(0, 1) = "tttt"
   test.Add tmp

  tmp(0, 0) = "test3"
  tmp(0, 1) = "zzz"
  test.Add tmp

  Debug.Print "データ数 : " & test.Count

  For Each ary In test
    Debug.Print ary(0, 0)
    Debug.Print ary(0, 1)
  Next

  Worksheets.Add Before:=Worksheets(1)

  For i = 1 To test.Count
    Range(Cells(i, 1), Cells(i, 10)) = test(i)
  Next

  Worksheets.Add Before:=Worksheets(1)

  For i = 1 To test.Count
    ary = test(i)
    Range(Cells(1, i * 2), Cells(10, i * 2)) = WorksheetFunction.Transpose(ary)
  Next
End Sub
    • good
    • 2
この回答へのお礼

まさにそのとうりです。
セルに取り出すところまでありがとうございます。

お礼日時:2016/01/26 23:09

こんなかんじで如何ですか?


値の無い要素もありますので、if文で選別して表示させています。

Sub foo()
Dim test As Collection
Set test = New Collection
Dim tmp(1, 9) As String ' tmp(0,9)を書き換えmした
Dim i As Long, j As Long

tmp(0, 0) = "test"
tmp(0, 1) = "56"
test.Add tmp

tmp(1, 0) = "test2" ' 最初の要素番号を書き換えました
tmp(1, 1) = "tttt" ' 同上
test.Add tmp

For i = 0 To UBound(tmp, 1)
For j = 0 To UBound(tmp, 2)
If tmp(i, j) <> "" Then ' 文字列が代入されている要素のみ表示させる。
MsgBox tmp(i, j) ' メッセージとして表示
End If
Next
Next
End Sub
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
UBound(tmp,1)のような使い方はしらなかったので助かりました。

今回は2次元配列のtmp(1,9) の 1の部分を動的に変えたかったのですが、
調べてみたら無理とのこと。
tmp(0,9)を作成し、データ入力→collection に add し、
ループでとれたらいいなと思い質問しました。
siffon9 さん ありがとうございました。

お礼日時:2016/01/26 08:47

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBA オブジェクトが空かどうか判定する

皆様のお知恵を拝借させてください。

エクセルVBAでオブジェクトを入れる変数を定義し、その変数にオブジェクト
が入っているかどうか検査したいのですがどうしたらいいでしょうか。

例えば---
Dim a As Workbook
If a <> nothing then ←この部分が分からない。このままだとエラー。
処理
End if
---------
環境
エクセル2003
WinXPsp1

Aベストアンサー

もし、aが空だったら
If a Is Nothing Then 

もし、aが空じゃなかったら
If Not a Is Nothing Then

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QVBAでfor文の中で、continueしたい

お世話になります。
VBAのfor文の中で、ある条件に合致したら、for の先頭に戻りたいのですが、
方法が分かりません。

VB.net 等の「 Continue For」に当たるものは、VBAに
ないのでしょうか?

何卒宜しくお願いします。

Aベストアンサー

Continue For は昔の VB6 までに物には実装されていませんね VB6 使いの私は知らなかった

for の先頭に戻りたいのではなく、 Next の直前に飛びたいのですよね?
幸いにも VBA には Goto ステートメントがありますので

Sub Sample1()
For i = 1 To 10
If 意除外条件 Then GoTo Next_no_mae

通常の総理

Next_no_mae:

Next i

End Sub

じゃダメですか?
これなら For の直後に飛ぶ事も可能ですが

もしくはこれぐらいしか対処方法はないのでは?
Sub Sample2()

For i = 1 To 10
If 除外条件 Then
Else
通常の総理
End If
Next i

End Sub

QFunctionの戻り値を配列にしたいのですが

vbを始めたばかりですがよろしくお願いします。

Functionの戻り値を配列にしたいのですが

Function fnc(ByVal a As Byte, ByVal b As Byte) As Integer()
fnc(0) = a + b
fnc(1) = a - b
End Function
というような使い方はできないのでしょうか?
一つのFunctionで二つの計算結果をかえすには
どうしたらよいのでしょうか?
お願いします。

Aベストアンサー

ローカル変数を使えば可能だと思いますよ

VB6.0の場合
Function fnc( byVal a as Byte, Byval b as Byte) as Integer
  dim ar(1) as Integer
  ar(0) = a + b
  ar(1) = a - b
  fnc = ar
End Function

VB.NETなら
Function fnc( byVal a as Byte, Byval b as Byte) as Integer
  dim ar(1) as Integer
  ar(0) = a + b
  ar(1) = a - b
  return ar
End Function

VB.NETでも fnc = ar と言った記述も出来ます

呼び出し側では 動的配列として返り値を受けます
dim results() as Integer
results = fnc( 5, 3 )
と言った具合です

QExcelVBAでデータを一括してセルに貼り付ける

こんばんは

ExcelVBAで教えてください。
配列のデータをセルに貼り付ける方法です。
一つ一つ行う方法は解ります。
しかし、これでは件数が多いと時間がかかってしまいます。
まとめて貼り付ける方法を教えてください。
例えば次のように100列1000行のデータのとき、一つ一つでは10万回も貼り付けることになります。
これを1行単位で1000回とか全部まとめて1回とかでできないでしょうか。
配列データを用意する都合で1行単位もお願いします。


For Row = 1 To 1000
For Column = 1 To 100
Cells(Row, Column).Value = 配列(Row - 1, Column - 1)
Next
Next

Aベストアンサー

http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_070_08.html
を参考にしてください。

Q定数配列の書き方

VB6で定数を定義する場合は次の通りです。

  Const strTest As String = "TEST"

では、定数配列を定義する場合はどのように書けばいいのでしょう?

  Const astrTest() As String = Array("A", "B", "C")      '→NG
  Const astrTest(0 To 2) As String = Array("A", "B", "C")  '→NG

いろいろな書き方を試して見たのですが、上記のような書き方でも文法的にエラーになるようです。

どのように書けばいいのでしょうか?

それとも定数を配列で定義するのは無理なんでしょうか?

Aベストアンサー

残念ですが、VBでご希望のことをすることはできません。

QExcel VBA Collection.add で Range型を格納したい

Collectionで複数のRangeを返す関数を作ったところ、
戻り値のCollection要素からRange型の変数に取り出す時にエラーとなる為
デバッガで見たところ、Range型そのものではなくRangeの展開された内容と
思しきものが入ってました。おそらく、Addするときに意図しない型変換が
かかってしまったものと思いますが、これを抑制する方法はありますか?
(写真添付)

もし無理なら、
・要素数可変の1次元配列(リスト構造)で複数のRangeを扱える。
・要素番号の指定により目的のRangeを取得する。
ことが出来れば手段は問いません。

Aベストアンサー

> 関数のカッコの有無は戻り値を使うか否かの為とあり、
> まったくキツネにつままれたようです。

こちらなどは分かりやすいと思いますが。

VBAにおける括弧()の使い方
http://excel-ubara.com/excelvba4/EXCEL244.html

QVBA 実行時エラー1004 rangeメソッドは失敗しました。globalオブジェクトのエラー

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義がまずいと思うのですが、それ以上の事は分かりません。どなたか、分かる方がおりましたら、よろしくお願いします。また、プログラムは以下のようになります。

Sub 繰り返し()
'繰り返し
Dim s As Integer
For s = 0 To 17
Range("cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)").Select
Range("cells(8,s+2)").Activate
Charts.Add
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("20081216_210647").Range( _
"cells(8,1):cells(1580,1),cells(8,s+2):cells(1580,s+2)"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""0810p2x"""
ActiveChart.Location Where:=xlLocationAsNewSheet, Name:="0810p2x"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = "0810p2x"
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t"
.Axes(xlValue, xlPrimary).HasTitle = False
End With
Next
End Sub

始めまして、VBA初心者のものです。
ただいまエクセルでグラフを作成しています。作業自体は単純作業の繰り返しなのでVBAを用いてやりたいのですが、マクロを実行したときに実行時エラー’1004’rangeメソッドは失敗しました。’_global’オブジェクトとメッセージが出て、実行できません。 デバックをすると以下の5行目で黄色のバーが出ていました。自分なりに原因を考えたのですがrangeの関係するところに、Range("A8:A1587,e8:e1587")というような変数を用いないやり方でやると上手くいくので、変数に関する定義...続きを読む

Aベストアンサー

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな(Excelで表示されている)シートが上位オブジェクトとして、自動的に認識されます。

≪例2≫
Sheets("Sheet2").Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、Rangeのみシート名が記述されています。
Sheets("Sheet2").Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
Activeなシートが、Sheet2の場合はエラーになりません。
しかし、ActiveなシートがSheet2以外の場合、エラーが発生します。
直前に、
Sheets("Sheet1").Select
などとしていれば、ActiveシートがSheet1になっていますから、エラーになります。

Sheets("Sheet2").Range(Sheets("Sheet2").Cells(8, 1), Sheets("Sheet2").Cells(1587, 2)).Select
と書いておけば安心です。
Withステートメントを使えばスッキリ纏めることができます。
With Sheets("Sheet2")
  .Range(.Cells(8, 1), .Cells(1587, 2)).Select
End With

# Sheets("Sheet2")の上位オブジェクトが省略されていることにも気がついてください。

>そこで自分で基礎を勉強したいのですが推薦できる参考書などがござ
>いましたら、教えていただけませんか?
私自身は、入門書程度の雑誌を1冊買っただけです。どれが良いとかはよく分かりません。
「マクロの記録」を活用して、参考コードを取得し、汎用性のあるコードに編集しています。
新しい単語があれば、文字カーソルを単語の上に置き、F1キーを押してVBAのヘルプを必ず見るようにしています。
躓いた時は、Web検索して欲しい情報を得たり、あるいは、こうした掲示板で先輩方のお力をお借りしています。

Excel(エクセル)VBA入門:目次
http://oshiete1.goo.ne.jp/kotaeru_reply.php3?q=4651404
エクセル入門・初級編
http://www.kenzo30.com/excel_kiso.htm

>ご指摘を受けたところを書き換えて回してみた結果、書き換えた箇所
>でエラーがでます。(実行時エラー’1004’’cells’メソッドは失敗
>しました。’global’オブジェクト)
>しかし、何が原因でエラーになるか自分では分かりません。

≪例1≫
Range(Cells(8, 1), Cells(1587, 2)).Select
上記の例では、RangeとかCellsの上位オブジェクトであるシート名が省略されています。
ActiveSheet.Range(ActiveSheet.Cells(8, 1), ActiveSheet.Cells(1587, 2)).Select
というわけです。
マクロ実行時に、Activeな...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング