VB6.0用掲示板の過去のログ(No.1)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [過去ログ] [管理用]

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


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- Web Forum -