- ベストアンサー
VB2008からのEXCEL出力に関して
- VB2008で開発を行っている際に、データをEXCELに出力する処理を行いたい場合、どのように記述すればいいかについて質問しています。
- すでに1シート目までの出力は正しく行われ、問題なくプロセスも終了できていますが、指定行までデータが書き込まれたら、新しいシートを追加して次のシートに記載するループ処理の記述方法が分からないという問題について質問しています。
- ループ処理においてどの部分をループ対象にすればいいかが分からないため、教えて欲しいという要望をしています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>指定の行(10行目)までデータが書き込まれたら、1シートを追加して次のシートに記載するというようなループ処理を考えていますが ここ(実例)が詳しく判らないので、役立たないかもしれないが、1シート分でやってみると、下記で (わたしの例では)Sheet9のセル範囲A16:D20に 番号 品名 価格 産地 1001 りんご 100 青森 1002 みかん 150 愛媛 1003 バナナ 200 台湾 1004 柿 150 奈良 となりました。(質問の例を変えているが。4列の4行の例) 下記では配列からセルにデータを1行のコードへセットしている。(Loopは不要) もちろん沢山行数が在る尾だろうから、それであれば、データ数で区切って、都度新しいシートを作り、そこへ書き出す繰り返しが必要。 シートの挿入は xlBook.Sheets.Add.name = "aaa" で出来た(VBAと同じ書き方)。 ーー セルへのデータのセットも下記は一旦配列にセットして、一括代入しているが Range()=・・・のようなVBAの書き方で良いのでは。 ーーー コマンドボタン4をキッカケに実行する例。 Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click '既存のEXCELファイルを開く Dim xlFilePath As String = "C:\Documents and Settings\XXXX\My Documents\コピー01化.xls" '起動時の処理 Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath) xlApp.Visible = True ' 確認のためExcelのウィンドウを表示する Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim sh = xlSheets(9) 'Dim xlSheet As Excel.Worksheet = CType(xlSheets.Item(1), Excel.Worksheet) 'データをEXCELファイルに書き出し Dim xlRange As Excel.Range 'Dim strDat(14, 14) xlRange = sh.Range("A17:D20") 'データの入力セル範囲 '---データ作成 sh.range("A16") = "番号" sh.range("B16") = "品名" sh.range("C16") = "価格" sh.range("D16") = "産地" 'strDat(x, 2) = h_date(x).IN_発注番号 'strDat(x, 3) = h_date(x).IN_品目名称 'strDat(x, 4) = h_date(x).IN_メーカー名 'strDat(x, 9) = h_date(x).IN_数量 'strDat(x, 10) = h_date(x).IN_単価 'strDat(x, 11) = h_date(x).IN_金額 'strDat(x, 12) = h_date(x).IN_備考 Dim myData(3, 3) As Object myData(0, 0) = 1001 myData(1, 0) = 1002 myData(2, 0) = 1003 myData(3, 0) = 1004 myData(0, 1) = "りんご" myData(1, 1) = "みかん" myData(2, 1) = "バナナ" myData(3, 1) = "柿" myData(0, 2) = 100 myData(1, 2) = 150 myData(2, 2) = 200 myData(3, 2) = 150 myData(0, 3) = "青森" myData(1, 3) = "愛媛" myData(2, 3) = "台湾" myData(3, 3) = "奈良" xlRange.Value = myData 'セルへデータの入力 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlRange) xlBooks.Close() xlApp.DisplayAlerts = False xlApp.Quit() ' COM オブジェクトの解放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlSheets) System.Runtime.InteropServices.Marshal.ReleaseComObject(sh) ' Excel のプロセス終了 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) End Sub End Class
その他の回答 (2)
- MARU4812
- ベストアンサー率43% (196/452)
>上記のように私もVBAでは理解ができ、記述もできますが、やはりVB2008となると >どうもどのように記述するのが正しいかわかりません。 同じだよ。参照設定してる時点で実行されるコマンドまで全く同じ。 VBから命令すると、実際の処理はエクセルが実行するからね。 それにCOM オブジェクトの解放の為の手順を加えるだけ。 そもそも質問は > どこまでをループ対象にすれば良いかが。。。 なんだから、Cor_moriyan さんのサンプルで十分すぎるわ。
- Cor_moriyan
- ベストアンサー率41% (92/221)
私はVBAが主なので・・・VBAで書きます。以下、ソースが参考になれば。 Sub ex() Dim wb As Workbook Dim ws As Worksheet Dim rg As Range Dim strDat(2, 2) As String Dim x As Integer Dim y As Integer Dim z As Integer Set wb = ThisWorkbook Set ws = wb.Worksheets("Sheet1") For z = 1 To 3 Set ws = wb.Worksheets.Add(After:=ws) Set rg = ws.Range("A1:C3") For y = 1 To 10 For x = 0 To 2 strDat(x, 0) = "aaa" & y & x strDat(x, 1) = "bbb" & y & x strDat(x, 2) = "ccc" & y & x Next rg.Value = strDat Set rg = rg.Offset(x, 0) Next Next End Sub シートを Sheet1 の後ろに追加し、配列strDatに代入された値を10セット、セルへセット。新しいシートを作成してさらに10セット。。。 質問者さんは > xlRange.Value = strDat 'セルへデータの入力 をDo~Loopの中に記述していますが。配列の中身を一気にセル範囲へセットするなら、Do~Loopの外で行わないと(^^;
お礼
教えて頂きありがとうございます。 確かに、xlRange.Value = strDat は外でしたね! 上記のように私もVBAでは理解ができ、記述もできますが、やはりVB2008となると どうもどのように記述するのが正しいかわかりません。 せっかく教えて頂いたのに申し訳ありません、