- ベストアンサー
マトリクス表へのデータ設定高速化方法を学びたい
- office2010のindex関数で別シートを参照してデータ設定する構成だと、データ数が多い場合に時間がかかるため、高速化の方法を知りたい。
- シート1にはマトリクス表のイメージがあり、列に日付、行に番号が設定されている。WORKシートには番号、文字列データ、日付と番号を合体させたデータが登録されている。計算式を使用してデータを設定しているが、実行時間が長すぎるため、高速化の方法を教えてほしい。
- Webで調べた結果、配列を使用すると高速化が可能とのことですが、式が複雑なため実装できない状況です。配列を使用せずに、効率的にデータを設定する方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
添付画像のレイアウトなら こんなコードでいかがでしょうか? Option Explicit Sub Sample() Dim tgtBk As Workbook Dim GetSh As Worksheet Dim PutSh As Worksheet Dim RowCounter As Long '行カウンター Dim Rowadr As Long '出力先行番号 Dim Coladr As Long '出力先列番号 Set tgtBk = ThisWorkbook Set GetSh = ThisWorkbook.Sheets("work") Set PutSh = ThisWorkbook.Sheets("Sheet1") RowCounter = 2 Do If GetSh.Cells(RowCounter, 1).Value = "" Then Exit Do Rowadr = GetRowNum(PutSh, GetSh.Cells(RowCounter, 1).Value) Coladr = GetColNum(PutSh.Cells(2, 10).Value, GetSh.Cells(RowCounter, 7).Value) If ((Rowadr > 5) And (Coladr > 9)) Then PutSh.Cells(Rowadr, Coladr).Value = GetSh.Cells(RowCounter, 2).Value Else MsgBox ("出力先アドレス算出不能 行:" & Format(RowCounter, "0")) End If RowCounter = RowCounter + 1 Loop End Sub '//行番号取得関数 Function GetRowNum(TblSh As Worksheet, BData As String) As Long Dim RowCounter As Long RowCounter = 6 GetRowNum = 0 Do If TblSh.Cells(RowCounter, 1).Value = "" Then Exit Do If TblSh.Cells(RowCounter, 1).Value = BData Then GetRowNum = RowCounter Exit Do End If RowCounter = RowCounter + 1 Loop End Function '//列番号取得関数 Function GetColNum(SDate As Date, MData As String) As Long Dim wkDate As Date wkDate = DateSerial(Left(MData, 4), Mid(MData, 5, 2), Mid(MData, 7, 2)) GetColNum = wkDate - SDate + 10 End Function
その他の回答 (1)
- 山田 太郎(@f_a_007)
- ベストアンサー率20% (955/4574)
Q、マトリクス表へのデータ設定高速化法。 A、VBAでプログラミングする。 >別シートを参照してデータ設定する構成だと・・・ この別シートが、一日単位で更新されると仮定。で、更新後に配列に呼び込んで利用できると仮定。この二つの仮定が成立すれば、セットする値の確定に要する時間は、0.001秒以下。後は、シートを更新する時間だけです。 Step1、別シートを更新する都度に、そのデータをバイナリーファイルとして排出する。 ・バイナリーデータのレコードは1行の構造体変数。 Step2、VBAで構造体変数を呼び込み、一気に処理する。 で、無事に高速化が達成されると思います。
お礼
回答ありがとうございます。
お礼
回答ありがとうございます。 助かりました。 もの凄く早く出来ました。 15[s]くらいで完了です。 ※ なお、番号の先頭、開始がセットされた、1つ左のセルには、E列の4桁の番号をセットする構成。 が無かったので、次の様に対応しました。 PutSh.Cells(Rowadr, Coladr).Value = GetSh.Cells(RowCounter, 2).Value →ここに追加 Else 下記を追加 If PutSh.Cells(Rowadr, Coladr).Value = "開始" Then Dim a As String a = Cells(Rowadr, 5).Value PutSh.Cells(Rowadr, Coladr - 1).Value = a End If また、書き込むセルが、数値4桁表現されなかったのでセル自体を文字列としました。