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

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

新規登録して質問してみよう
ただいま回答率
85.50%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Q&A

解決済

1回答

8257閲覧

VB エクセル書き込み

IkumiFukiishi

総合スコア13

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

0グッド

0クリップ

投稿2016/01/21 01:28

編集2016/01/21 06:57

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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/21 03:37

編集2016/01/21 07:03
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

IkumiFukiishi

2016/01/21 04:29 編集

いつもありがとうございます. 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 と表示されます. 参照設定の仕方がまちがっているのでしょうか.
jawa

2016/01/21 04:37

最初にインポートはされていますでしょうか? ``` Imports Microsoft.Office.Interop.Excel ``` インポートしなくても ``` Dim xlApp As New Microsoft.Office.Interop.Excel.Application ``` のような書き方をすれば利用できますが、インポートしたほうが扱いやすくなります。
IkumiFukiishi

2016/01/21 04:40

Public Class Form1 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 こういうことでしょうか
jawa

2016/01/21 04:58

Classよりも上、ファイルの先頭に書いてあげてください。 そうすることでインポートした名前空間が省略可能になります。 ``` Imports Microsoft.Office.Interop.Excel Public Class Form1  ~ ``` ↓Excel操作の参考にどうぞ https://code.msdn.microsoft.com/office/VB-Excel-Sheet-f6dbabf9
IkumiFukiishi

2016/01/21 05:45 編集

Imports Microsoft.Office.Interop.Excel 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 エクセルはひらきましたが,指定したブックではないようです
IkumiFukiishi

2016/01/21 06:00

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim ExcApp As Object ExcApp = CreateObject("Excel.Application") ExcApp.workbooks.add() ExcApp.visible = True End Sub でできました.
jawa

2016/01/21 07:02

追記分について追記しました。
IkumiFukiishi

2016/01/21 07:32

ありがとうございます. xlBook = xlApp.Workbooks.Open(myPath) この部分でエラーがでてしまいました.
IkumiFukiishi

2016/01/21 08:07

Dim myPath As String = "C:\Users\Ikumi Fukiishi\Desktop\Book1.xlsx" 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 シートの指定部分がやはり間違っているようなのですが,どうのように変えたらいいでしょうか
Alice0225

2016/01/21 08:11

xlBook = xlBook.Open("myPath") ではなく xlBook = xlBook.Open(myPath)
IkumiFukiishi

2016/01/21 08:22

ありがとうございます.記入ミスです.エラーがでたのはその一行したでした.
Alice0225

2016/01/21 08:31

xlSheet = xlBook.Worksheet(1) を xlSheet = xlBook.Worksheets(1) とするとどうですか?
IkumiFukiishi

2016/01/21 09:02

Worksheets is not a member of Microsoft.office.Interop.Excel.workbooksと表示され,実行できません.
jawa

2016/01/21 09: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) ``` という感じでいかがでしょうか?
IkumiFukiishi

2016/01/21 10:08

ありがとうございました.エラーなくエクセルを開くことができました. しかし,セルに文字が入力されません. このコードではできないのでしょうか?
jawa

2016/01/22 00: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"が表示されませんか?
IkumiFukiishi

2016/01/22 01:27

ありがとうございます. XXXXは表示されました.リッチテキストボックスなどの設定の問題でしょうか??
jawa

2016/01/22 01:34 編集

Form_Loadでの処理(つまり起動直後の処理)なので、フォームのデザイン時にプロパティ設定した値が表示されることになると思います。 もちろん、Form_Load後、Excelに値を表示するまでの間にラベルやテキストに値を設定してあげればその値が反映されるはずです。
IkumiFukiishi

2016/01/22 01: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 一定時間ごとにリッチテキストボックスやラベルに文字が表示されるため,次々に新しくエクセルを開いてしまいます. これをひとつのエクセルのシートにいれるにはどうすればよいのでしょうか.
IkumiFukiishi

2016/01/22 02:10 編集

現在のコード全体です. 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
jawa

2016/01/22 02:10

上記コードであればForm_Load時にしかブックをオープンしていないので、次々にブックを開くようなことはなさそうですが・・。 上記でも同じ現象ですか?
IkumiFukiishi

2016/01/22 02:33

コードを編集しました.ブックはひとつだけですが,文字が次々書き換えられていきます.
jawa

2016/01/22 04:05

Timer1イベント発生時、及びクリック発生時にcolorword1・2を呼びだしており、その中でセルに値をセットしていますので、文字が次々書き換えられていくのはこのためです。 期待する動作が分からないので改善案は提示できませんが・・。
IkumiFukiishi

2016/01/22 07:01

セルに入力していきたいのです.例えば一つ目は(1,1),二つ目は(2,1)のようなかんじです.
jawa

2016/01/22 07: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 ```
IkumiFukiishi

2016/01/22 08: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
jawa

2016/01/25 00:36

nに何も値をセットしていない状態(integer型で宣言しているのでn=0)で初回のタイマーイベントが発生し、その処理の中でセルの行番号として使用されています。 セルの行列番号はワークシート左上(A1セル)を(1,1)としていますので、0値では例外エラーが発生しているようです。 エラーが発生した際は、デバッグ実行でエラーが発生する個所をつきとめると原因が特定しやすくなります。 困ったときはデバッグ実行などで想定外の動作をしている箇所を確認してみてください。
IkumiFukiishi

2016/01/25 00:58 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問