C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

VB.NETでExcel図形のテキストボックスで編集する

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■83077 / inTopicNo.1)  VB.NETでExcel図形のテキストボックスで編集する
  
□投稿者/ 大吉 (1回)-(2017/03/03(Fri) 18:55:52)

分類:[VB.NET/VB2005 以降] 

環境
Windows7
VisualStudio 2010
Office pro 2010
.net framework 4.5.2

VB.NETのアプリからExcelを開いて
Excel上の図形テキストボックスに値を入れたいと考えています。
Cellには文字を入力出来るのですが、図形テキストボックスへの入れ方がわかりません。

マクロでコードを作成して、それを参考にしても名前が見つからないというエラーになります。
ご教授願います。
宜しくお願い致します。
引用返信 編集キー/
■83098 / inTopicNo.2)  Re[1]: VB.NETでExcel図形のテキストボックスで編集する
□投稿者/ 魔界の仮面弁士 (1159回)-(2017/03/06(Mon) 18:45:35)
2017/03/06(Mon) 19:21:58 編集(投稿者)

No83077 (大吉 さん) に返信
> マクロでコードを作成して、それを参考にしても名前が見つからないというエラーになります。

どういうコードに対して、どの行が実行されたときに
「名前が見つからないというエラー」になるのでしょうか。


> Cellには文字を入力出来るのですが、図形テキストボックスへの入れ方がわかりません。

レスが付かないようなので、とりあえずサンプルだけ提示しておきます。
参考までにフォントや文字色も指定しているため、幾許か冗長的なコードになっています。


Option Strict On
Imports Excel = Microsoft.Office.Interop.Excel
Imports Microsoft.Office.Core
Imports System.Runtime.InteropServices
Public Class Form1
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim fullText As String = "サンプル:" & vbCrLf & "文字列値の入力"
    Dim altText As String = "テキストボックス"


    Dim oApp As New Excel.Application()
    Dim oBooks As Excel.Workbooks = oApp.Workbooks
    Dim sheetsInNewWorkbook As Integer = oApp.SheetsInNewWorkbook

    '1シートだけのブックを作成
    oApp.SheetsInNewWorkbook = 1
    Dim oBook As Excel.Workbook = oBooks.Add()
    oApp.SheetsInNewWorkbook = sheetsInNewWorkbook
    Dim oWorksheets As Excel.Sheets = oBook.Worksheets

    Dim oSheet As Excel.Worksheet = DirectCast(oWorksheets(1), Excel.Worksheet)
    oSheet.Name = "シート1"
    Dim oShapes As Excel.Shapes = oSheet.Shapes

    oApp.Visible = True

    '貼り付ける座標を指定してテキストボックスを追加します
    Dim oTextBox As Excel.Shape = oShapes.AddTextbox( _
      MsoTextOrientation.msoTextOrientationHorizontal, 30.0F, 30.0F, 280.0F, 160.0F)

    '後で識別できるよう、一意な名前をつけておきます
    oTextBox.Name = "TextBoxSample1"
    '
    '新規にテキストボックスを作成するのではなく、
    '既存のブック上にあるテキストボックスを名前で検索するには
    '下記のように Item メソッドを通じてアクセスします
    '
    'oTextBox = oShapes.Item("TextBoxSample1")

    '以下、フォントとか色とかマージンなどといろいろ指定していますが
    '「テキストボックスへ文字列を代入」するために本当に必要なのは★の行です
    oTextBox.AlternativeText = altText '代替テキスト

    Dim oTF As Excel.TextFrame = oTextBox.TextFrame
    Dim oCharsAll As Excel.Characters = oTF.Characters()

    Dim oFont As Excel.Font = oCharsAll.Font
    oFont.Name = "MS P明朝"
    oFont.Size = 12.0F
    oFont.Color = RGB(0, 0, 255)

    'Excel 2007 以降では Font2 オブジェクトで指定する必要があるので
    'バージョン分岐の処理を記述しています
    If Val(oApp.Version) >= 12.0 Then
      Dim oTF2 As Excel.TextFrame2 = oTextBox.TextFrame2
      Dim oTxtRng2 As TextRange2 = oTF2.TextRange
      oTxtRng2.Text = fullText '★
      Dim oFont2 As Font2 = oTxtRng2.Font
      oFont2.Name = CStr(oFont.Name)     '[英数字用のフォント]を指定
      oFont2.NameFarEast = CStr(oFont.Name) '[日本語用のフォント]を指定
      RelaseComObject(oFont2)
      RelaseComObject(oTxtRng2)
      RelaseComObject(oTF2)
    Else
      oCharsAll.Text = fullText '★
    End If
    RelaseComObject(oFont)

    oTF.MarginLeft = 5
    oTF.MarginTop = 5
    oTF.MarginRight = 15
    oTF.MarginBottom = 10

    '先頭 5 文字だけ、書式を変更してみる
    Dim oChars As Excel.Characters = oTF.Characters(1, 5)
    RelaseComObject(oFont)
    oFont = oChars.Font
    oFont.Size = 9.0F
    oFont.Bold = True
    oFont.Color = RGB(255, 0, 0)
    RelaseComObject(oFont)
    RelaseComObject(oChars)

    '後始末
    RelaseComObject(oCharsAll)
    RelaseComObject(oTextBox)
    RelaseComObject(oShapes)
    RelaseComObject(oSheet)
    oBook.Saved = True
    RelaseComObject(oWorksheets)
    'oBook.Close(SaveChanges:=False)
    RelaseComObject(oBook)
    RelaseComObject(oBooks)
    RelaseComObject(oWorksheets)
    'oApp.Quit()
    RelaseComObject(oApp)
  End Sub

  Private Shared Sub RelaseComObject(Of T As Class)(ByRef o As T, Optional ByVal final As Boolean = False)
    If o IsNot Nothing Then
      If Marshal.IsComObject(o) Then
        Dim released As Boolean = False
        If final Then
          Marshal.FinalReleaseComObject(o)
          released = True
        Else
          released = Marshal.ReleaseComObject(o) <= 0
        End If
        If released Then
          o = Nothing
        End If
      Else
        Debug.WriteLine("COMオブジェクトではありません:" & o.GetType().FullName)
      End If
    End If
  End Sub
End Class



上記では Version プロパティを用いて、Excel 2007 以降かどうかの判定処理を入れていますが、
文字列のセットだけでよいのなら、そもそも Font プロパティを辿る必要は無く、
Shapeオブジェクト.TextFrame.Characters().Text プロパティもしくは
Shapeオブジェクト.TextFrame2.TextRange.Text プロパティを書き換えるだけで OK です。
(使用する COM オブジェクトの階層が深いので、ReleaseComObject の呼び忘れに注意)

ちなみに、Version プロパティの判定で
 If Val(oApp.Version) >= 12.0 Then
のように Val を用いているのは、Version が String 値を返すためです。
とはいえ今回は Excel 2010 固定なので、判定コードは省略しても構いません。


"16.0" → Excel 2016
"15.0" → Excel 2013
"14.0" → Excel 2010
 :
"10.0" → Excel 2002
"9.0" → Excel 2000
 :
"8.0k" → Excel 97 Service Release 2 + Xl8p9pkg.exe
 :
"8.0f" → Excel 97 Service Release 2 + Xl8p4pkg.exe
"8.0e" → Excel 97 Service Release 2
"8.0d" → Excel 97 Service Release 1 + Xl8p3pkg.exe
"8.0c" → Excel 97 Service Release 1 + Xl8p2pkg.exe
"8.0b" → Excel 97 Service Release 1 + Xl8p1pkg.exe
"8.0a" → Excel 97 Service Release 1
"8.0" → Excel 97 初版
引用返信 編集キー/
■83125 / inTopicNo.3)  Re[2]: VB.NETでExcel図形のテキストボックスで編集する
□投稿者/ 大吉 (2回)-(2017/03/07(Tue) 13:02:38)
サンプルありがとうございます。

sheet.Shapes.item("郵便番号").TextFrame2.TextRange.Characters.Text
にて値の代入に成功しました。

グループ化していたり、他シートを参照していたりと図形オブジェクトの名前が見つからないという
エラーに悩まされていました。
グループ解除をしたのちに値変更。再度グループ化で目的のものが出来ました。
ありがとうございました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ