tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル最後にエクセルシート追加は可能でしょうか
記事No11577
投稿日: 2016/01/07(Thu) 14:36
投稿者SUZUKI
VB6.0からVB2005変換挑戦中のSUZUKIです
連続の質問で申し訳ありませんが付合っていただければ幸いです
花ちゃんのご指摘を受けエクセルの制御を参照型にして
お勉強始めたのですが、なかなか解決しないのが出て来ました
下記はシート追加、名前変更のサンプルです。ほとんどコピーですが。。。。
当方最初のシート枚数が3枚なのでうまく動かないと思うのですが、

シート追加は最初のシートの前に追加されます
名前変更は最後のシートに反映されます
ここで悩みました、
最後のシートの後ろに追加するにはどうするんだろう?
マクロをしても最初に追加されるのでダメなのかも知れないのですが
ある程度の結論を出したく質問させて頂きました
よろしくお願いします


   Private Sub Button1_Click
        Dim xlApp As Excel.Application
        Dim xlBooks As Excel.Workbooks
        Dim xlBook As Excel.Workbook
        Dim xlSheets As Excel.Sheets
        Dim xlSheet As Excel.Worksheet
        Dim SHEETCOUNT As Integer
        Dim I As Integer
        xlApp = New Excel.Application
        xlBooks = xlApp.Workbooks
        '既存のファイルを開く
        xlBook = xlBooks.Open("C:\TEST.XLS")
        xlSheets = xlBook.Worksheets
        xlApp.Visible = True     ' xlApp = New Excel.Application
        SHEETCOUNT = xlSheets.Count
        'Excel の裏に隠れたりしますので、オーナーウィンドウ(Me)を指定下さい。
        MessageBox.Show(Me, "現在のシート(Worksheet)数 = " & SHEETCOUNT & " です。")
        '新規にシートを追加
        Dim xlSheet2 As Excel.Worksheet
        xlSheet2 = DirectCast(xlSheets.Add, Excel.Worksheet)
        MRComObject(xlSheet2)
        SHEETCOUNT = xlSheets.Count
        MessageBox.Show(Me, "シートを1個追加したので、Worksheet 数 = " & SHEETCOUNT & " です。")
        '追加したシートの名前を取得()
        Dim xlSheet1 As Excel.Worksheet
        xlSheet1 = DirectCast(xlSheets.Item(SHEETCOUNT), Excel.Worksheet)
        MessageBox.Show(Me, "追加したシート名 = " & xlSheet1.Name & " です。")
        ' 追加したシートの名前を変更()
        xlSheet1.Name = "Test1"
        '変更したシート名を取得(確認)
        MessageBox.Show(Me, "シート名を " & xlSheet1.Name & " に変更しました。")
        MRComObject(xlSheet1)

LABELA:
        xlBook.SaveAs("C:\TEST1.XLS")

        MRComObject(xlSheet, True)
        MRComObject(xlSheets, True)
        xlBook.Close()
        MRComObject(xlBook, True)
        MRComObject(xlBooks, True)
        xlApp.Quit()
        MRComObject(xlApp, True)
        MsgBox("エクセル出力成功しました?")
    End Sub

[ツリー表示へ]
タイトルRe: 最後にエクセルシート追加は可能でしょうか
記事No11578
投稿日: 2016/01/07(Thu) 15:06
投稿者Hongliang
まず、Excelでマクロを記録させながらやりたいことを手動でやってみて、そのマクロを参考にすると良いです。
実際にシート一覧右端の追加ボタンを押す操作をマクロで記録してみると、以下のVBAが出力されるようです。
Sheets.Add After:=Sheets(Sheets.Count)

> xlSheet2 = DirectCast(xlSheets.Add, Excel.Worksheet)

ですので、
・Sheets(SHEETCOUNT)でまず末尾のWorksheetを取得する
・Addメソッドの呼び出しで、After引数にそれを渡す
ということをすればいいでしょう。

> '追加したシートの名前を取得()
> Dim xlSheet1 As Excel.Worksheet
> xlSheet1 = DirectCast(xlSheets.Item(SHEETCOUNT), Excel.Worksheet)
> MessageBox.Show(Me, "追加したシート名 = " & xlSheet1.Name & " です。")
> ' 追加したシートの名前を変更()
> xlSheet1.Name = "Test1"
> '変更したシート名を取得(確認)
> MessageBox.Show(Me, "シート名を " & xlSheet1.Name & " に変更しました。")

そもそも、追加したWorksheetはAddメソッドの返値として手に入っていますよね?
わざわざxlSheetsから改めて取ってくる必要はないと思います。

[ツリー表示へ]
タイトルRe^2: 最後にエクセルシート追加は可能でしょうか
記事No11579
投稿日: 2016/01/07(Thu) 16:30
投稿者SUZUKI
Hongliang さん 回答ありがとうございます
現在、参照型、遅延型、VB6 VB2005 でごっちゃになり
なかなか理解が進んでいない状態です
花ちゃんの例題から離れるとすぐ迷路に入る状態です

”DirectCast”に初めて会ったというレベルですので
よろしくお願いします

それで Addメソッドの使い方がよくわかりません
  Dim xlSheet2 As Excel.Worksheet
    xlSheet2 = xlSheets.Add(After:=xlSheets(4))
として見たのですが

Option Strict On で 'Object' から 'Microsoft.Office.Interop.Excel.Worksheet'
への暗黙的な変換はできません

というエラーになります

 

[ツリー表示へ]
タイトルRe^3: 最後にエクセルシート追加は可能でしょうか
記事No11580
投稿日: 2016/01/07(Thu) 17:21
投稿者花ちゃん
>     xlSheet2 = xlSheets.Add(After:=xlSheets(4))
> として見たのですが


前には、 xlSheet2 = DirectCast(xlSheets.Add, Excel.Worksheet) にしていたのでは。
          xlSheet2 = xlSheets.Add() これでは、同様のエラーがでるので、上記のようにしたのでは。

”DirectCast”に初めて会ったというレベルですので

理解して使っているのなら、下記のようにしないと

          xlSheet2 = DirectCast(xlSheets.Add(After:=xlSheets.Item(4)), Excel.Worksheet)
又は、    xlSheet2 = DirectCast(xlSheets.Add(After:=xlSheets(xlSheets.Count)), Excel.Worksheet)

[ツリー表示へ]
タイトルRe^4: 最後にエクセルシート追加は可能でしょうか
記事No11581
投稿日: 2016/01/08(Fri) 10:14
投稿者SUZUKI
回答ありがとうございます
花ちゃん 例題 NO。20を引用していますが抜けていました
申し訳ありません

指摘どおりやって見ました
数字は3としております

        Dim xlSheet2 As Excel.Worksheet
        ' xlSheet2 = DirectCast(xlSheets.Add, Excel.Worksheet)
        xlSheet2 = DirectCast(xlSheets.Add(After:=xlSheets.Item(3)), Excel.Worksheet)
        MRComObject(xlSheet2)
意図するとおり 追加されたシートが名前変更されるようになり
メッセージとおりとなりました
が、しかしです
EXCELが停止しなくなりました
これは、不思議で私の理解を超えています
何をデクリメントすべきか見当もつかない状況です

[ツリー表示へ]
タイトルRe^5: 解決したような(閉じさせていただきます)
記事No11583
投稿日: 2016/01/08(Fri) 14:01
投稿者SUZUKI
色々 アドバイスありがとうございます
       Dim xlSheet3 As Excel.Worksheet
      xlSheet3 =  DirectCast(xlSheets.Item(3), Excel.Worksheet)
      xlSheet2 =  DirectCast(xlSheets.Add(After:=xlSheet3), Excel.Worksheet)

上記で最善かは別として
エクセルが残るという現象は無くなりました
ただ、保存しますかというメッセージがクリックしないと出なくなったのですが?
メッセージは出さない予定なのでよしとします

今回の教訓として vb2005でのエクセル操作は
とにかく一つの変数に置き換えないといけない
置き換えられるかどうかがまた一つの技量という事でした

[ツリー表示へ]