エクセルVBAの配列について

このQ&Aのポイント
  • VBA初心者がエクセルVBAの配列について質問しています。データを配列に入れ、別シートに書き出したいが、現在は最終行のみを書き出してしまっている状況です。どのように書き直せば良いか分からないとのことです。
  • 配列にデータを入れるためのVBAコードがありますが、最終行のみを書き出してしまうという問題が発生しています。どのように修正すれば良いか分からないとのことです。
  • VBA初心者がエクセルVBAの配列に関する問題を抱えています。現在、データを配列に入れて別シートに書き出す作業を行っていますが、最終行のみが書き出されてしまっています。どのように修正すれば良いかご教示願います。
回答を見る
  • ベストアンサー

エクセルVBAの配列について

エクセルVBAの配列について VBAをはじめたばかりの初心者です。 現在、下記のようにデータを配列の中に入れ、 別シートに書き出そうとしております。 (配列へ読み込むところのみ) Dim 配列(1 To 件数, 1 To 9) As Variant For j =1 To 件数 For i = 2 To L If Cells(i, 2).Value = Tx_month Then For k = 3 To 11 配列(j, k - 2) = Cells(i, k).Value Next k End If Next j,i 現状では、データの最終行のみを「件数」分書き出してしまいます。 jとiのForが重なっているからだと思うのですが、どう書き直したら良いか分かりません。 質問をさせていただくのも初めてなので、分かりづらく恐縮ですが お力添え頂けますと幸いです。 どうぞ宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

色々あると思いますがまぁそういうのは置いておいて,今の着想を出来るだけ生かすとしたら… 例: Dim 配列(1 To 件数, 1 To 9) As Variant 件数カウンタ = 0 for i = 2 to L  if cells(i, 2).value = tx_month then   件数カウンタ = 件数カウンタ + 1   for k = 3 to 11    配列(件数カウンタ,k - 2) = cells(i, k).value   next k  end if next i といった具合かなと思います。

oishiimikan
質問者

お礼

ありがとうございました! 異なるデータが書けるようになりました!!!

関連するQ&A

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • ExcelのVBAがオーバーフローに!?

    読んで頂きありがとうございます。 以前に質問しました時に回答を頂き凄く助かっていたのですが、何故か「オーバーフロー」と表示されてしまいます。 ひょっとしたら桁なのかも知れません。 下記のVBAを教えて頂きしようしていました。 Option Explicit Sub Test() Dim c(), p(), q(), i, j, l, r, k As Long r = Range("B2").End(xlDown).Row l = Range("D2").End(xlDown).Row ReDim c(r - 2), p(r - 2), q(r - 2) For i = 1 To r - 2 c(i) = Cells(i + 2, 2).Value p(i) = Cells(i + 2, 3).Value q(i) = i + 2 Next i For i = 1 To r - 3 For j = i + 1 To r - 2 If c(i) > c(j) Then k = c(i) c(i) = c(j) c(j) = k k = p(i) p(i) = p(j) p(j) = k k = q(i) q(i) = q(j) q(j) = k End If Next j Next i For i = 1 To r - 2 Cells(i + 2, 7).Value = c(i) For j = 3 To r If Cells(j, 4).Value = c(i) Then Cells(i + 2, 8).Value = p(i) - Cells(j, 5).Value If p(i) - Cells(j, 5).Value <> 0 Then Range("B" & q(i)).Interior.ColorIndex = 6 Range("D" & j).Interior.ColorIndex = 6 End If Exit For End If Next j Next i For i = 3 To r k = 0 For j = 3 To l If Cells(i, 2).Value = Cells(j, 4).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("B" & i).Interior.ColorIndex = 35 End If Next i For i = 3 To l k = 0 For j = 3 To r If Cells(i, 4).Value = Cells(j, 2).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("D" & i).Interior.ColorIndex = 35 End If Next i End Sub デパックのClickすると15行目辺りの「k = c(i)」が黄色くなります。 正直言ってマクロとか全く解りませんが、コピーして使っていました。 どこをどう変更すれば良いのか教えて頂ければ助かります。 よろしくお願いします。

  • VBAの配列について

    初めまして、VBAの配列の入力方法について質問させてください。 大量のデータの処理を高速化するため、配列を使用して以下のVBAを入力しました。 インターネットで調べ、見よう見まねで入力してみたものです…(T_T) 内容は、シート「資料」のC列とシート「Sheet1」のG列の文字列が同じ かつ、シート「資料」のL列から最終列(そのときによって変化します) とシート「Sheet1」のE列の文字列が同じ場合、 シート「資料」のA列~D列及びL列から最終列で文字列の一致したセルを 着色するというものです。 変数「アイス」と「チョコ」にそれぞれシート「資料」のデータと シート「Sheet1」のデータを格納したつもりなのですが、 実行したところ「配列がありません。」というエラーメッセージが 表示されました。 どうやらデータを配列として格納できていないときに表示される エラーメッセージのようなのですが、変数の型を変更してみたり、 配列をアイス(2)にしてみたりと、色々方法を変えて試してみたものの、 処理は成功しませんでした(T_T) 一体何が原因で処理が成功しないのか、どなたかご教授いただけると とても嬉しいです…!よろしくお願いいたします。 ちなみに、配列を使用しない場合の処理は、時間が15分ほどと かなりかかりますが、成功しています。 Application.ScreenUpdating = True Dim アイス, チョコ As Long Dim i As Integer, j As Integer, k As Integer アイス = Sheets("資料").Cells(Rows.Count, 1).End(xlUp).Row チョコ = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row For i = 3 To Sheets("資料").Cells(Rows.Count, 1).End(xlUp).Row For j = 12 To Sheets("資料").Cells(i, 12).End(xlToRight).Column For k = 2 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If アイス(i, 3).Value = チョコ(k, 7).Value And アイス(i, j).Value = チョコ(k, 5).Value Then Sheets("資料").Range("A" & i & ":D" & i).Interior.ColorIndex = 22 アイス(i, j).Interior.ColorIndex = 22 End If Next k Next j Next i

  • VBA 配列計算について 配列の入力に配列の使用

    配列に複数のセル値の合計値を設定したいと思っています。 求める合計値は複数あるため、出力も配列となります。 そこで下記のようにプログラムを考えたのですが、全て同じ値の配列として出力されてしまいます。 VBAではC言語のように配列の古い値に足していくことはできないのでしょうか? (sum()は0で初期化) (10個飛ばしのデータの合計値を算出) For i = 0 To 10 For j = 0 To 5 sum(i)= sum(i) + Worksheets(sheetname).Cells(10, 3).Offset(j * 10, 0).Value Next i Next j 出力配列例 全て同じ値になってしまいます・・・ 1.254 1.254 1.254 ・・・ 回避方法もしくはうまい計算方法などありませんでしょうか

  • VBA Progress barが動作しない

    VBA初心者です Progress barを追加したいのですが、上手く動きません というのは、 おそらく記述位置が間違っていると思われますので、 どこにどうやったら良いか教えて頂けませんか? 使用ソフト:Excel2003(32bit) i-1行目まで数える際に、Progress barを動作させたい ※Userform1にProgress bar2を追加 Sub progress_bar () Dim i As Variant Dim k As Variant Userform1.Show False DoEvents For k = 1 To i Userform1.ProgressBar2.Value = k / i * 100 '処理件数 / 総件数 * 100 'i-1行目までで必要な行(0かつブランク)を1、不要な行(それ以外)を2とフラグを付ける For i = 2 To 30000 If Cells(i, 5) = "" Then Exit For If Cells(i, 13) = 0 And Cells(i, 26) = "" Then Cells(i, 81) = 1 Else: Cells(i, 81) = 2 End If Next Next Userform1.Hide End sub

  • Excel VBAで検索する

    Excel VBAで、Sheet1に貼り付けたテキスト内から Sheet2に記載した(1列ごとの)キーワードを検索し キーワードが含まれている行をSheet3に貼り付ける処理をしているのですが、始めたばかりなので上手くいきません。 下記がソースです。 Dim moji As String Dim word As String Dim result As Integer For i = 3 To 103 For j = 2 To 21 moji = ThisWorkbook.Worksheets("Sheet1").Cells (i, 1).Value word = ThisWorkbook.Worksheets("Sheet2").Cells (j, 2).Value result = InStr(moji, word) If doResult <> 0 Then For k = 1 To 100 ThisWorkbook.Worksheets("Sheet3").Cells (k, 1).Value= moji Next k End If Next j Next i このソースでは上手くいかないのですが、どこがダメなのか分からないので、解決の糸口がつかめません。 アドバイスなどお願いします。

  • VBA For~Next 

    「wsData」の値を「wsInv」の指定セル(=●●●=16)から4つおきに処理したい。 01:Cells(16 + i * 4, 1) とすると「i」が大きいときに   「""」があると16からスタートしない 02:「For k = 0 To 50」を作成したが、何処に入れても上手く処理出来ない。 For i = 0 To 50 '行 For j = 6 To 28 '列 If wsData.Cells(10 + i, 3).Value = "" Then wsInv.Cells(●●●, 1).Value = wsData.Cells(10 + i, 1).Value wsInv.Cells(●●●, j - 2).Value = wsData.Cells(10 + i, 23 + j).Value End If Next j Next i お力添えをお願いいたします。

  • VBA なぜ配列にドカンと一発で入れることが出来る

    下に2つのコードを示していますが、パターン1は、配列cに一発で一気に速く入れることが出来る雰囲気が表れています。実際に速いそうです。 しかしながら、どちらのコードも、最終的には配列cに一つずつデータが入るわけですよね。 なぜ、パターン1だと速いのでしょうか? 専門的でむずかしいようでしたら、イメージだけでも教えていただけたらと思います。 パターン1 Dim r as Range Dim c() As Variant Set r=Selection c = r.Value パターン2 redim c(r.rows.count,r.columns.count) for i=1 to r.rows.count for j=1 to r.columns.count c(i,j)=r(i,j).value next j next i

  • Excelのセルから配列変数への一括読込み

    VB(というかプログラミング)の超初心者です。 Excelシートの任意の領域にある数値を、配列変数に一括して 入力したいと思っています。 これまで、 Dim XXX(10) As Variant For I = 1 To 10 XXX(I - 1) = Cells(1, I).Value Next I Range(Cells(10, 1), Cells(10, 10)).Value = XXX の様な感じで処理していましたが(最近まで、セルへの書込みも For-Nextで処理していました)、データ数が多くなると処理に 時間がかかってしまいます。 配列YYYへの読込みもセルへの書込みの様に一括して行うには どうすれば良いでしょうか? よろしくお願いします。

  • セルの数字を配列に格納するためのVBAソースは?

    どなたかご存知でしたらご教授願います。 以前、こちらの相談室にて、エクセルで「25C5」という組み合わせを作成するVBAソース を見つけました。これを少し改造して下記のようなソースにしました。 【25C5を作成するソース】 Sub test() Const MaxNum = 25 Dim s(25) As String s(1) = "9" s(2) = "10" s(3) = "19" s(4) = "23" s(5) = "25" s(6) = "8" s(7) = "17" s(8) = "22" s(9) = "24" s(10) = "31" s(11) = "6" s(12) = "7" s(13) = "16" s(14) = "18" s(15) = "21" s(16) = "4" s(17) = "14" s(18) = "15" s(19) = "29" s(20) = "30" s(21) = "2" s(22) = "12" s(23) = "13" s(24) = "27" s(25) = "28" Dim i, j, k, l, m Dim rowX As Long rowX = 1 rowX = rowX + 1 For i = 1 To MaxNum - 4 For j = i + 1 To MaxNum - 3 For k = j + 1 To MaxNum - 2 For l = k + 1 To MaxNum - 1 For m = l + 1 To MaxNum Cells(rowX, 1).Value = s(i) Cells(rowX, 2).Value = s(j) Cells(rowX, 3).Value = s(k) Cells(rowX, 4).Value = s(l) Cells(rowX, 5).Value = s(m) rowX = rowX + 1 Next m Next l Next k Next j Next i End Sub ここで質問ですが、上記ソースの配列は25個(S(1)~S(25))あります。 現在は上記ソースの配列1つずつに毎回直接数字を設定しております。 これが面倒くさいので、下記のようにセルに貼り付けをしたら、 それを自動で配列に格納して、上記ソースへと連動させるためのVBAソースは どうやって記述すればよいですか? 【セルに貼り付ける数字】 9     10     19    23     25 8     17     22    24     31 6     7      16    18     21 4     14     15    29     30 2     12     13    27     28 ●注意事項   (1)セルに貼り付ける数字の値は毎回異なりますが、5×5は毎回同じです。   (2)使用するエクセルは2010です。 以上

専門家に質問してみよう