質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.22%

VB エクセル書き込み

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 5,412

IkumiFukiishi

score 13

VB で新規にエクセルを開き,一定時間ごとに変更するリッチテキストボックスやラベルの文字をエクセルのセルに自動で入力させ,エクセルを名前をつけて保存するということをしたいです.

VBでエクセルを開く方法を調べると,プロジェクトの参照設定で Microsoft Excel.ObjectLibrary にチェックを入れなければならないようなのですが,見当たりません.
コードをかくだけではエクセルは開けないのでしょうか?
また,
  Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
  Set xlApp = CreateObject("Excel.Application")
  Set xlBook = xlApp.Workbooks.Add
  Set xlSheet = xlBook.Worksheets(1)

というコードでは実行できませんでした.
アドバイスよろしくお願いします.

追記:
   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim ExcApp As Object
        Dim n As Integer
        Dim myPath As String = "C:\Users\Ikumi Fukiishi\Desktop\Book1.xlsx"
        ExcApp = CreateObject("Excel.Application")
        ExcApp.workbooks.open(myPath)
        ExcApp.visible = True

        ExcApp.cells(n, 1).value = RichTextBox1.Text
        ExcApp.cells(n, 2).value = Label1.Text
    End Sub

リッチテキストボックスやラベルの文字を開いたエクセルのセルに入力していきたいです.
上の追記したコードではエラーがでました.
アドバイスをよろしくお願いします.

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

Excelがインストールされていれば参照設定のCOMタブにExcelの名前が出てくると思いますが・・・見つかりませんか?

あと技術的な部分ですが、以下の宣言

Dim xlApp As Excel.Application 
Dim xlBook As Excel.Workbook 
Dim xlSheet As Excel.Worksheet


は参照設定をすることで使用できるようになります。(事前バインディング)
参照設定を行っていなければ、まずこの部分でエラーが発生するのではないかと思われます。

これに対して、

Set xlApp = CreateObject("Excel.Application")


で行っているのは、事前バインディングせず、実行時にExcelオブジェクトを生成するやり方(遅延バインディング)です。
クライアントのExcelバージョンに依存しないようにする目的などで利用され、参照設定も必要ありません。

遅延バインディングで実装する場合、各変数の宣言はobject型で行えばよいです。
ただし、コーディング時にパラメータの候補が表示されないなどのデメリットもあるため、開発時は参照設定できたほうが楽です。

Dim xlApp As Object 
Dim xlBook As Object
Dim xlSheet As Object

Set xlApp = CreateObject("Excel.Application")


(追記)
セルの値を参照・編集するためには、対象のブックやシートまで特定してあげる必要があります。
まずは開いたエクセルに対する操作の仕方を勉強しましょう。
 ⇒参考

事前バインディングの場合 (参照設定が必要)

Imports Microsoft.Office.Interop.Excel

Public Class Form1
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    '変数宣言
    Dim myPath As String = "C:\Users\Ikumi Fukiishi\Desktop\Book1.xlsx"
    Dim xlApp As New Application()
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet

    'ファイルオープン
    xlBook = xlApp.Workbooks.Open(myPath) 
    xlSheet = xlBook.Worksheets(1)
    xlApp.Visible = True

    'Excel操作
    xlSheet.Cells(1, 1).value = RichTextBox1.Text 
    xlSheet.Cells(1, 2).value = Label1.Text 

    '上書保存
    xlBook.Save()

    'Excelを閉じる
    xlApp.Workbooks.Close()
    xlApp.Quit()

  End Sub
End Class

遅延バインディングの場合

Public Class Form1
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    '変数宣言
    Dim myPath As String = "C:\Users\Ikumi Fukiishi\Desktop\Book1.xlsx"
    Dim xlApp As Object
    Dim xlBook As Object
    Dim xlSheet As Object

    'Excelオブジェクト作成
    xlApp = CreateObject("Excel.Application")

    'ファイルオープン
    xlBook = xlApp.Workbooks.Open(myPath) 
    xlSheet = xlBook.Worksheets(1)
    xlApp.Visible = True

    'Excel操作
    xlSheet.Cells(1, 1).value = RichTextBox1.Text 
    xlSheet.Cells(1, 2).value = Label1.Text 

    '上書保存
    xlBook.Save()

    'Excelを閉じる
    xlApp.Workbooks.Close()
    xlApp.Quit()
  End Sub
End Class

なお、ご覧になってわかるとおり、違いは変数宣言とExcelオブジェクトの作成までで、あとは共通の記述です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/22 17:32

    実行はできたのですが,すぐに終了してしまいました.
    Imports Microsoft.Office.Interop.Excel
    Public Class Form1
    Dim myPath As String = "C:\Users\Ikumi Fukiishi\Desktop\Book1.xlsx"
    Dim xlApp As New Application()
    Dim xlBook As Workbook
    Dim xlSheet As Worksheet
    Dim iResult As Integer
    Dim n As Integer
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    xlBook = xlApp.Workbooks.Open(myPath)
    xlSheet = xlBook.Worksheets(1)
    xlApp.Visible = True
    End Sub
    Private Sub colorword1()
    Dim a() As String = New String() {"あか", "あお", "みどり"}
    Randomize()
    Label1.Text = a(Math.Floor(3 * Rnd()))
    RichTextBox1.Text = a(Math.Floor(3 * Rnd()))
    RichTextBox1.SelectionAlignment = HorizontalAlignment.Center
    xlSheet.Cells(n, 1).value = RichTextBox1.Text
    xlSheet.Cells(n, 2).value = iResult
    xlSheet.Cells(n, 3).value = Label1.Text
    n = n + 1
    End Sub
    Private Sub colorword2()
    Dim rnd As New System.Random()
    iResult = rnd.Next(3)
    If iResult = 0 Then
    RichTextBox1.ForeColor = Color.Red '0の時は赤
    ElseIf iResult = 1 Then
    RichTextBox1.ForeColor = Color.Blue '1の時は青
    ElseIf iResult = 2 Then
    RichTextBox1.ForeColor = Color.Green '2の時は緑
    End If
    End Sub
    Private Sub Form1_Activated(sender As Object, e As EventArgs) Handles Me.Activated
    Me.WindowState = FormWindowState.Maximized
    Me.Timer1.Interval = 1000 * 4
    Me.Timer1.Start()
    Me.Timer2.Start()
    Me.Timer2.Interval = 1000 * 60 * 6
    End Sub
    Public Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Call colorword2()
    Call colorword1()

    End Sub
    Public Sub Timer2_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    Form2.Show()
    End Sub
    Private Sub Form1_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
    Select Case e.Button
    Case MouseButtons.Left
    Me.Timer1.Stop()
    Call colorword1()
    Call colorword2()
    Me.Timer1.Interval = 4000
    Me.Timer1.Start()
    xlSheet.Cells(n, 4).value = "F"
    n = n + 1
    Case MouseButtons.Right
    Me.Timer1.Stop()
    Call colorword1()
    Call colorword2()
    Me.Timer1.Interval = 4000
    Me.Timer1.Start()
    xlSheet.Cells(n, 4).value = "T"
    n = n + 1
    End Select
    End Sub
    Private Function RGB(p1 As Integer) As Color
    Throw New NotImplementedException
    End Function
    End Class

    キャンセル

  • 2016/01/25 09:36

    nに何も値をセットしていない状態(integer型で宣言しているのでn=0)で初回のタイマーイベントが発生し、その処理の中でセルの行番号として使用されています。
    セルの行列番号はワークシート左上(A1セル)を(1,1)としていますので、0値では例外エラーが発生しているようです。

    エラーが発生した際は、デバッグ実行でエラーが発生する個所をつきとめると原因が特定しやすくなります。
    困ったときはデバッグ実行などで想定外の動作をしている箇所を確認してみてください。

    キャンセル

  • 2016/01/25 09:54 編集

    できました!ありがとうございます.

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る