投稿日 | : 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