[リストへもどる]
一括表示

投稿時間:2004/01/05(Mon) 15:43
投稿者名:kaminari
Eメール:
URL :
タイトル:
VBからのExcel操作法について
お世話になります。

VBからExcelを動かすプログラムを作成しております。
マスターのExcelファイルをコピーして、コピーしたExcelファイルに
データを書き込むプログラムです。

Excel上にオートシェイプのテキストボックス(@)を配置してあり、VBで
コマンドボタンを押したときに@に値を書き込みたいのですが、
上手くいきません。

マクロを作成して、ソースを見てみたのですが、理解できませんでした。
どなたかご教授お願いいたします。

また、Excelの結合したセルに次々とデータを入れていこうとしたのですが、
上手くいきませんでした。
簡単なソースを示させていただきます。
-------
A1-A2(@) A3-A4(A) A5-A6(B)を結合しています

グリッドのデータA、B,Cをそれぞれ@、A、Bに入れようとしましたが
@にだけAが入り、ABには入りませんでした。
grid.TextMatrix(1, 1)=A
grid.TextMatrix(1, 2)=B
grid.TextMatrix(1, 3)=C


for b= 1 to 3
    a=a+1
    objExcelApp.ActiveSheet.Cells(1, a).Value = grid.TextMatrix(b, 1)
next b
-------

結合したセルを指定する方法がありましたら、ご教授お願い致します。

環境は
VB6.0
Excel97

です。
よろしくお願い致します。

投稿時間:2004/01/05(Mon) 16:52
投稿者名:mami
URL :
タイトル:
Re: VBからのExcel操作法について
こんにちは。
実は、私も同じように VB から Excel で帳票を作成するプログラムを作成しています。

@オートシェイプは、結構難しいですよね。
 私は、配置する時にテキストを書込むようにしています。
 私が今日、 ak さんから返事を頂いた「Re:エクセルのオートシェイプについて」を見て頂ければ
 ヒントになりませんか?

A結合したセルへ値を書込む時ですが、私も同じ事をしてしまったので、お気持ちお察しします。

> A1-A2(@) A3-A4(A) A5-A6(B)を結合しています

 という事でしたので

> grid.TextMatrix(1, 1)=A
> grid.TextMatrix(1, 3)=B
> grid.TextMatrix(1, 5)=C

 で、いけると思います。
 結合しても、指定の仕方は変わらないようです。

投稿時間:2004/01/06(Tue) 09:06
投稿者名:kaminari
Eメール:
URL :
タイトル:
Re^2: VBからのExcel操作法について
mamiさんご回答ありがとうございます。

>  私は、配置する時にテキストを書込むようにしています

今回、理由があり、配置後にテキストに書き込みたいと思っております。
もう少し、調べてみます。

> > A1-A2(@) A3-A4(A) A5-A6(B)を結合しています
>
>  という事でしたので
>  
> > grid.TextMatrix(1, 1)=A
> > grid.TextMatrix(1, 3)=B
> > grid.TextMatrix(1, 5)=C
>
>で、いけると思います

私の説明不足で申し訳ありませんが、今回VBのグリッドのデータの量が多いため
なんとかFor文で処理したいと考えております。
いろいろ試していますが、まだうまく動きません。

投稿時間:2004/01/06(Tue) 12:39
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: VBからのExcel操作法について
> Excel上にオートシェイプのテキストボックス(@)を配置してあり、VBで
> コマンドボタンを押したときに@に値を書き込みたいのですが、
> マクロを作成して、ソースを見てみたのですが、理解できませんでした。
マクロを見ましたが、特に複雑なところが無いようですが、こちらも何か条件が
あるのでしょうか? 条件があるなら質問時に記入しておくべきかと!
下記ではだめなのですか?(マクロのままですが)
xlSheet.Shapes("AutoShape 1").Select
xlApp.Selection.Characters.Text = "あいうえお"

上記で問題が解決しないなら、今現在どのようなコードを使用して、そのコードでは
なぜ、だめなのかを投稿するようにして下さい。
>ソースを見てみたのですが、理解できませんでした
では、マクロのどこが理解できないか解らないし、理解できない部分をヘルプ等で調べたのかも
解りません。又、そのマクロを実際に使って見たのですか?

> また、Excelの結合したセルに次々とデータを入れていこうとしたのですが、
> 上手くいきませんでした。
スマートではありませんが、簡単なので下記を一度試して見て下さい。
Dim i As Long, n As Long
For i = 1 To 10
    n = n + 1
    xlSheet.Cells(i, 1).Value = "TEST"
    If xlSheet.Cells(i, 1).Value = "TEST" Then
        xlSheet.Cells(i, 1).Value = Chr(n + 64)
    Else
        n = n - 1
    End If
Next i

又は
Dim i As Long, n As Long
For i = 1 To 10
    If i > 1 And xlSheet.Range(xlSheet.Cells(i, 1), _
                 xlSheet.Cells(i, 1)).MergeArea.Address <> _
                 xlSheet.Range(xlSheet.Cells(i - 1, 1), _
                 xlSheet.Cells(i - 1, 1)).MergeArea.Address Then
        n = n + 1
        xlSheet.Cells(i, 1).Value = Chr(n + 64)
    End If
Next i

投稿時間:2004/01/06(Tue) 14:58
投稿者名:kaminari
Eメール:
URL :
タイトル:
Re^2: VBからのExcel操作法について
花ちゃんさん、ご回答ありがとうございます。


> > Excel上にオートシェイプのテキストボックス(@)を配置してあり、VBで
> > コマンドボタンを押したときに@に値を書き込みたいのですが、
> > マクロを作成して、ソースを見てみたのですが、理解できませんでした。
> マクロを見ましたが、特に複雑なところが無いようですが、こちらも何か条件が
> あるのでしょうか? 条件があるなら質問時に記入しておくべきかと!

既存のExcelファイルを開き、編集して別名で保存しようとしております。
初心者で大変申し訳ないですが、コードを示させていだだきます。
●の部分で「オブジェクト変数またはWithブロック変数が定義されていません」とエラーが出てしまいます。

-----------------------------
Private Sub Command1_Click()
  Dim objExcelApp  As Workbook
  Dim strExcelFile As String
  Dim strExcelSheet As String
    Dim xlApp   As Excel.Application


  strExcelFile = "D:\test.xls"

  strExcelSheet = "sheet1"

  Set objExcelApp = GetObject(strExcelFile, "Excel.Sheet")
    Set xlApp = CreateObject("Excel.Application")

    objExcelApp.ActiveSheet.Shapes("Text Box 1").Select
    ●xlApp.ActiveSheet.Selection.Characters.Text = "12345"

  objExcelApp.SaveAs "d:\test---.xls"

  objExcelApp.Application.Quit


  Set objExcelApp = Nothing
    Set xlApp = Nothing

End Sub
-----------------------------

Dim i As Long, n As Long
For i = 1 To 10
     n = n + 1
     xlSheet.Cells(1, i).Value = "TEST"
     If xlSheet.Cells(1, i).Value = "TEST" Then
         xlSheet.Cells(1, i).Value = Chr(n + 64)
     Else
         n = n - 1
     End If
Next i

i をX方向に変えて、試させて頂きました。
セルを結合していない場合は綺麗に代入されるのですが、
(1, 1)と(2,1)を結合、(3,1)と(4,1)・(5,1)と(6,1)のように二つずつ結合したときに実行すると
結合されたセルにはA,B,C,D,Eまでしか代入されませんでした。

もう少し試して見たいと思います。

説明下手にもかかわらず、ご協力いただきまして、ありがとうございました。

投稿時間:2004/01/06(Tue) 15:01
投稿者名:kaminari
Eメール:
URL :
タイトル:
Re^3: VBからのExcel操作法について
自己レスで申し訳ないです。
座標を間違えて記入してしまいました。

◎ (1, 1)と(1,2)を結合、(1,3)と(1,4)・(1,5)と(1,6) です

投稿時間:2004/01/06(Tue) 15:45
投稿者名:ak
Eメール:
URL :
タイトル:
Re^3: VBからのExcel操作法について
こんにちは。

> 既存のExcelファイルを開き、編集して別名で保存しようとしております。
> 初心者で大変申し訳ないですが、コードを示させていだだきます。
> ●の部分で「オブジェクト変数またはWithブロック変数が定義されていません」とエラーが出てしまいます。
>
> -----------------------------
> Private Sub Command1_Click()
>   Dim objExcelApp  As Workbook
>   Dim strExcelFile As String
>   Dim strExcelSheet As String
>     Dim xlApp   As Excel.Application
>
>
>   strExcelFile = "D:\test.xls"
>
>   strExcelSheet = "sheet1"
>
>   Set objExcelApp = GetObject(strExcelFile, "Excel.Sheet")
>     Set xlApp = CreateObject("Excel.Application")
>
>     objExcelApp.ActiveSheet.Shapes("Text Box 1").Select
>     ●xlApp.ActiveSheet.Selection.Characters.Text = "12345"
>
>   objExcelApp.SaveAs "d:\test---.xls"
>
>   objExcelApp.Application.Quit
>
>
>   Set objExcelApp = Nothing
>     Set xlApp = Nothing
>
> End Sub

恐らくオートシェイプの名前が間違っているのでしょう。

そういったミスをなくす為にも生成時に下記のように名前を指定しておいた方が良いと思います。

'オートシェイプ生成
With xlsWkBook.ActiveSheet.Shapes.AddShape(1, 100, 100, 100, 100)
    .Name = "Shape1"  '名前を指定する
End With
  
値の代入は下記のコードでいけるはずです。
  
'テキストボックスの内容をオートシェイプに代入
xlsWkBook.ActiveSheet.Shapes("Shape1").TextFrame.Characters.Text = "代入する値"


>  Dim i As Long, n As Long
>  For i = 1 To 10
>      n = n + 1
>      xlSheet.Cells(1, i).Value = "TEST"
>      If xlSheet.Cells(1, i).Value = "TEST" Then
>          xlSheet.Cells(1, i).Value = Chr(n + 64)
>      Else
>          n = n - 1
>      End If
>  Next i
>
> i をX方向に変えて、試させて頂きました。
> セルを結合していない場合は綺麗に代入されるのですが、
> (1, 1)と(1, 2)を結合、(1,3)と(1,4)・(1,5)と(1,6)のように二つずつ結合したときに実行すると
> 結合されたセルにはA,B,C,D,Eまでしか代入されませんでした。
(1,7)と(1,8)・(1,9)と(1,10)も結合しているのであれば
ABCDEまでしか代入されなくて当然です。
自分自身でそういうプログラムを書いているということにはお気付きでしょうか?

上記サンプルだと10回まわると処理が終了されます。

10個のデータを代入したいのであれば10個代入するまで回し続ければ良いと思います。
(はずしていたらすみません。)

下記にサンプルを記述しておきますので参考にしてください。

上記サンプルでは結合セルを判別する為にその都度値を代入して確かめているみたいですが、
下記サンプルのように結合セルかどうか判別し、その範囲を取得し無駄な代入を避ける方が
より効率的だと思います。

Public Sub Test()
    Dim i       As Long
    Dim n       As Long
    Dim xlSheet As Worksheet
    Dim sArea   As String
    Dim sTmp    As String
    
    Set xlSheet = ThisWorkbook.ActiveSheet

    With xlSheet
        Do While Not n = 10
            i = i + 1
            sTmp = ""
            If .Range(.Cells(1, i), .Cells(1, i)).MergeCells Then
                '結合セルの場合
                '結合セルの範囲のアドレスを取得
                sTmp = .Range(.Cells(1, i), .Cells(1, i)).MergeArea.Address
                If sArea <> sTmp Then
                    'エリアが違う場合のみ代入
                    n = n + 1
                    .Range(sTmp).Value = Chr(n + 64)
                End If
            Else
                '結合されていないセルの場合
                n = n + 1
                .Cells(1, i).Value = Chr(n + 64)
            End If
            sArea = sTmp    'バックアップ
        Loop
    
    End With
    
End Sub

投稿時間:2004/01/06(Tue) 15:48
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: VBからのExcel操作法について
>     objExcelApp.ActiveSheet.Shapes("Text Box 1").Select
>     ●xlApp.ActiveSheet.Selection.Characters.Text = "12345"

どのようなオートシェイプを使っているのですか?
取得したマクロはどのようになっていましたか?
私の投稿したコードを試して見ましたか?
オートシェイプにTextBox コントロールを貼り付けられました?
"Text Box 1" は何なのでしょうか?

> i をX方向に変えて、試させて頂きました。
> セルを結合していない場合は綺麗に代入されるのですが、
> (1, 1)と(1,2)を結合、(1,3)と(1,4)・(1,5)と(1,6)のように二つずつ結合したときに実行すると
> 結合されたセルにはA,B,C,D,Eまでしか代入されませんでした。

一体何がしたいのでしょうか?Excelの場合結合すれば、データは結合セルに1個しか入力
出来ないはずですが?(MSFlexGrid と違って)
ひょっとして MSFlexGrid(マージしている)のデータをExcelに表示しようとしているのですか?
どのようにセルに入力したいのか書いてください。

投稿時間:2004/01/06(Tue) 16:24
投稿者名:でっち
Eメール:
URL :
タイトル:
Re^3: VBからのExcel操作法について
>  Dim i As Long, n As Long
>  For i = 1 To 10
>      n = n + 1
>      xlSheet.Cells(1, i).Value = "TEST"
>      If xlSheet.Cells(1, i).Value = "TEST" Then
>          xlSheet.Cells(1, i).Value = Chr(n + 64)
>      Else
>          n = n - 1
>      End If
>  Next i
>
> i をX方向に変えて、試させて頂きました。
> セルを結合していない場合は綺麗に代入されるのですが、
> (1, 1)と(2,1)を結合、(3,1)と(4,1)・(5,1)と(6,1)のように二つずつ結合したときに実行すると
> 結合されたセルにはA,B,C,D,Eまでしか代入されませんでした。
>
とりあえず、こっちのほうだけ。
mamiさんのコードを見るとセルを結合したときは結合セルの
先頭セルに値を入れなければならないようですので、
    For i = 1 To 10
        n = n + 1
        xlSheet.Cells(1, 2 * i - 1).Value = "TEST"
        If xlSheet.Cells(1, 2 * i - 1).Value = "TEST" Then
            xlSheet.Cells(1, 2 * i - 1).Value = Chr(n + 64)
        End If
    Next i
上記のように指定してやれば、セルに値が入ると思います。

投稿時間:2004/01/06(Tue) 16:49
投稿者名:ak
Eメール:
URL :
タイトル:
Re^4: VBからのExcel操作法について
> >  Dim i As Long, n As Long
> >  For i = 1 To 10
> >      n = n + 1
> >      xlSheet.Cells(1, i).Value = "TEST"
> >      If xlSheet.Cells(1, i).Value = "TEST" Then
> >          xlSheet.Cells(1, i).Value = Chr(n + 64)
> >      Else
> >          n = n - 1
> >      End If
> >  Next i
> >
> > i をX方向に変えて、試させて頂きました。
> > セルを結合していない場合は綺麗に代入されるのですが、
> > (1, 1)と(2,1)を結合、(3,1)と(4,1)・(5,1)と(6,1)のように二つずつ結合したときに実行すると
> > 結合されたセルにはA,B,C,D,Eまでしか代入されませんでした。
> >
> とりあえず、こっちのほうだけ。
> mamiさんのコードを見るとセルを結合したときは結合セルの
> 先頭セルに値を入れなければならないようですので、
>     For i = 1 To 10
>         n = n + 1
>         xlSheet.Cells(1, 2 * i - 1).Value = "TEST"
>         If xlSheet.Cells(1, 2 * i - 1).Value = "TEST" Then
>             xlSheet.Cells(1, 2 * i - 1).Value = Chr(n + 64)
>         End If
>     Next i
> 上記のように指定してやれば、セルに値が入ると思います。

こんにちは。

今回の例だと上手く動くと思いますが例えば3つセルが結合されている時、
間に結合されていないセルがあった時はどうするのでしょうか?

上記サンプルでは流用できませんよね。

気になったもので気分を悪くしたらすみません。

投稿時間:2004/01/06(Tue) 17:34
投稿者名:kaminari
Eメール:
URL :
タイトル:
Re^5: VBからのExcel操作法について
皆さんに比べ、私のレベルが低すぎるため、
まず、やりたかったことを説明させていただきます。

VB側で3行−1000列程のFlexgridがあり、そこにデータが
入っています。
例えば、一列目に1〜1000の数字が順番に入っているとします。
その一列目のデータを、以下のフォーマットのExcelファイルに送ろうと
していました。


 |A|B|C|D|E|F|G|H|I|J|
 +−+−+−+−+−+−+−+−+−+−+
1|結合@+結合A+結合B+結合C+結合D+
2|結合E+結合F+・・・・・・・・結合I+


私が出したかった結果は
結合@:1
結合A:2


結合1000:1000
と代入することでした。

皆さんの投稿、また自分のソースをよくよく確認したところ、自分のミス
ということが、わかりました。(ループをデータ分回していませんでした。)

花ちゃんさんのコードや、akさんの投稿を拝見し、気づくことができました。
そしてとても参考になりました。

また、オートシェイプの件ですが、
花ちゃんさんのコードを実行したところうまくいきました。

大変、掲示板を乱してしまい、反省しております。

ありがとうございました。
またなにかありましたらお願い致します。