VB エクセル書き込み
- 評価
- クリップ 0
- VIEW 5,412
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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オブジェクトの作成までで、あとは共通の記述です。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.22%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/01/21 13:25 編集
COMタブだったんですね.ありました.チェックを入れることができました.
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
End Sub
ただ実行ができませんでした.
Excel.Application is not defined と表示されます.
参照設定の仕方がまちがっているのでしょうか.
2016/01/21 13:37
```
Imports Microsoft.Office.Interop.Excel
```
インポートしなくても
```
Dim xlApp As New Microsoft.Office.Interop.Excel.Application
```
のような書き方をすれば利用できますが、インポートしたほうが扱いやすくなります。
2016/01/21 13:40
Imports Microsoft.Office.Interop.Excel
Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
xlApp = CreateObject("Excel.Application")
xlBook = xlApp.Workbooks.Add
xlSheet = xlBook.Worksheets(1)
End Class
こういうことでしょうか
2016/01/21 13:58
そうすることでインポートした名前空間が省略可能になります。
```
Imports Microsoft.Office.Interop.Excel
Public Class Form1
~
```
↓Excel操作の参考にどうぞ
https://code.msdn.microsoft.com/office/VB-Excel-Sheet-f6dbabf9
2016/01/21 14:05 編集
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim fileName As String = "C:\Users\Ikumi Fukiishi\Desktop\Book1.xlsx"
Dim xlApp As New Application()
xlApp.Visible = True
End Sub
End Class
エクセルはひらきましたが,指定したブックではないようです
2016/01/21 15:00
Dim ExcApp As Object
ExcApp = CreateObject("Excel.Application")
ExcApp.workbooks.add()
ExcApp.visible = True
End Sub
でできました.
2016/01/21 16:02
2016/01/21 16:32
xlBook = xlApp.Workbooks.Open(myPath)
この部分でエラーがでてしまいました.
2016/01/21 17:07
Dim xlApp As New Application()
Dim xlBook As Workbooks
Dim xlSheet As Worksheet
xlApp.DisplayAlerts = False
xlBook = xlApp.Workbooks
xlBook = xlBook.Open("myPath")
xlSheet = xlBook.Worksheet(1)
xlApp.Visible = True
xlSheet.Cells(1, 1).value = RichTextBox1.Text
xlSheet.Cells(1, 2).value = Label1.Text
シートの指定部分がやはり間違っているようなのですが,どうのように変えたらいいでしょうか
2016/01/21 17:11
ではなく
xlBook = xlBook.Open(myPath)
2016/01/21 17:22
2016/01/21 17:31
を
xlSheet = xlBook.Worksheets(1)
とするとどうですか?
2016/01/21 18:02
2016/01/21 18:48
```
Dim xlBooks As Workbooks
Dim xlBook As Workbook
```
と宣言している部分を
```
Dim xlBook As Workbooks
```
と一本化してしまったところが問題かもしれません。
改善案としては
```
Dim xlBook As Workbook
xlBook = xlApp.Workbooks.Open(myPath)
xlSheet = xlBook.Worksheets(1)
```
という感じでいかがでしょうか?
2016/01/21 19:08
しかし,セルに文字が入力されません.
このコードではできないのでしょうか?
2016/01/22 09:30
```
Imports Microsoft.Office.Interop.Excel
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim myPath As String = "C:\Work\Book1.xlsx"
Dim xlApp As New Application()
Dim xlBook As Workbook
Dim xlSheet As Worksheet
xlApp.DisplayAlerts = False
xlBook = xlApp.Workbooks.Open(myPath)
xlSheet = xlBook.Worksheets(1)
xlApp.Visible = True
xlSheet.Cells(1, 1).value = RichTextBox1.Text
xlSheet.Cells(1, 2).value = Label1.Text
End Sub
```
当方の環境では上記でエクセルでファイルが開き、セルの値がRichTextBox1とLabel1の初期値に変更されるようです。
例えば上記に加え
```
xlSheet.Cells(1, 3).value = "XXXX"
```
のようにしてもセルC1に"XXXX"が表示されませんか?
2016/01/22 10:27
XXXXは表示されました.リッチテキストボックスなどの設定の問題でしょうか??
2016/01/22 10:33 編集
もちろん、Form_Load後、Excelに値を表示するまでの間にラベルやテキストに値を設定してあげればその値が反映されるはずです。
2016/01/22 10:44
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
Dim myPath As String = "C:\Users\Ikumi Fukiishi\Desktop\Book1.xlsx"
Dim xlApp As New Application()
Dim xlBook As Workbook
Dim xlSheet As Worksheet
xlBook = xlApp.Workbooks.Open(myPath)
xlSheet = xlBook.Worksheets(1)
xlApp.Visible = True
xlSheet.Cells(1, 1).value = RichTextBox1.Text
xlSheet.Cells(1, 2).value = Label1.Tex
一定時間ごとにリッチテキストボックスやラベルに文字が表示されるため,次々に新しくエクセルを開いてしまいます.
これをひとつのエクセルのシートにいれるにはどうすればよいのでしょうか.
2016/01/22 10:54 編集
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
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(1, 1).value = RichTextBox1.Text
xlSheet.Cells(1, 2).value = iResult
xlSheet.Cells(1, 3).value = Label1.Text
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 colorword1()
Call colorword2()
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(1, 4).value = "F"
Case MouseButtons.Right
Me.Timer1.Stop()
Call colorword1()
Call colorword2()
Me.Timer1.Interval = 4000
Me.Timer1.Start()
xlSheet.Cells(1, 4).value = "T"
End Select
End Sub
Private Function RGB(p1 As Integer) As Color
Throw New NotImplementedException
End Function
End Class
2016/01/22 11:10
上記でも同じ現象ですか?
2016/01/22 11:33
2016/01/22 13:05
期待する動作が分からないので改善案は提示できませんが・・。
2016/01/22 16:01
2016/01/22 16:55
```
Dim n As Integer
ExcApp.cells(n, 1).value = RichTextBox1.Text
ExcApp.cells(n, 2).value = Label1.Text
```
の部分ですね。
nをPublicにしておいて、セルに値をセットする毎に1ずつ加算すればいいと思います。
```
n = n + 1
```
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
セルの行列番号はワークシート左上(A1セル)を(1,1)としていますので、0値では例外エラーが発生しているようです。
エラーが発生した際は、デバッグ実行でエラーが発生する個所をつきとめると原因が特定しやすくなります。
困ったときはデバッグ実行などで想定外の動作をしている箇所を確認してみてください。
2016/01/25 09:54 編集