• 締切済み

Excel VBA 値取得について

お世話になります。 どなたかお力をお貸しください。 Excel2003 VBAでプログラムを組んでおり、エクセルのシートをデータベース代わりに利用しています。 複数のブック散乱している10万個近くのテキストボックスの値を、 「A」というブックの「シート1」のセルに格納して行きたいと思っております。 値の格納方法としては、「A」ブックの「シート1」の セルA1からA2、A3…A列最終行(6万強)まで縦の並びにデータを格納していきます。 ただし、「シート1」に格納したい値は10万個近くあるので、 A列だけでは足りなくなります。 A列の最終行まで値を格納し終えたら、自動的にB列に移動して、 セルB1からB2、B3…B列最終行(6万強)という遷移させていきたいのです。 A列のみに格納していくのであれば、理解できるのですが、 自動遷移がわかりません。 For i = 0 To 最終行(6万強) シート1.Range("A" & i) = 参照元 Next i よろしくお願いします。

みんなの回答

  • Hardking
  • ベストアンサー率45% (73/160)
回答No.5

『複数のブック散乱している10万個近くのテキストボックスの値』 とあるが、とりあえずワークブックのファイル数とファイル名と 対象シートは特定されている考え、テキストボックスの個数と名前は 不定という仕様とします。 (1).ワークブック「A」をオープンする。 Workbooks.Open ファイル名 (2).データ格納用動的配列変数の定義 Public mstrTextValue() As String (3).該当ワークブックをオープンし、ブック中の全テキストボックス の値を配列変数 mstrTextValueに格納する。 ※全シート中のコントロール種別がテキストボックスであるものが対象です (4).該当ワークブックをクローズする(ブックの本数分、(3)、(4)を繰り返す。) (5).ワークブック「A」の「シート1」を配列変数(テキストボックス)の値を表示する。 セル位置を行、列の二次元指定する。 Dim rowidx As Long Dim colidx As Long '行インデックス 初期値=1行目 rowidx = 1; '列インデックス 初期値=1行目 colidx = 1; '配列の要素分(テキストボックスの全個数分 繰り返す For idx = 1 To UBound(mstrTextValue) シート1.cells(rowidx, colidx) = mstrTextValue(idx) '行インデックス カウントアップ rowidx = rowidx + 1; '最終行の超過チェック If rowidx >= 65536 Then '行インデックス 初期化=1行目 rowidx = 1; '列インデックス カウントアップ colidx = colidx + 1; end If Next idx (5).ワークブック「A」の「シート1」をアクティブする。

  • jam-best
  • ベストアンサー率27% (94/344)
回答No.4

No.3です。 失礼しました。最後Next lcnt ですね。 まったくインデントされてなく申し訳ないです。

  • jam-best
  • ベストアンサー率27% (94/344)
回答No.3

こんな方法はどうでしょうか。 RangeでなくCellsで指定。 Dim lcnt as long 'カウンタ用 Dim lGyo as long '行 Dim iRetu as Integer '列 lGyo = 1 iRetu = 1 For lcnt = 1 To データ数 Step 1 シート1.Cells(lGyo,iRetu).value = 参照元 lGyo = lGyo + 1 If lGyo > 65536 Then lGyo = 1 iRetu = iRetu + 1 End if Next lGyo 汚いソースですが^^;参照までに。

noname#109581
noname#109581
回答No.2

そもそも、10万件のデータをExcelの、しかも一つのシートに記録する事がおかしいとは思うのですが… ご質問の件は、まず繰り返しを Do Loop 構文にした方がよいでしょう。それから Range("範囲") よりも Cells(行, 列) を利用した方がキレイに書けますね。 Do While (データがあるよ、という条件式)  シート1.Cells(row, col) = 参照元  row = row + 1  If (row > 行数の最大) Then   col = 2   row = 1  End If Loop 確認せず適当に書いてますが、タブンこんな感じでしょう。

  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

i = 0 でエラーになります。 以下のような感じでどうでしょうか? Dim i as long, j as long dim Rng as Range Dim DataCnt as long dim UseColumn as Integer Dim RowCount as long DataCnt = 100000 UseColumn = 65536/datacnt+1 Set Rng = Range(シート1.Cells(1, 1),シート1.Cells(65536,UseColumn)) RowCount = 65536 For j = 1 to UseColumn IF j = UseColumn then RowCount = DataCnt - RowCount * (j-1) End if For i = 1 to RowCount Rng.Cells(i,j).Value = 参照元 Next i Next j