投稿時間: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
|