tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル.NETからExcelを操作してコントロールをコピペするには
記事No6719
投稿日: 2007/12/25(Tue) 13:20
投稿者音羽
VB.NETからExcelを操作して表を作成しています。
ひな形となるSheet1からSheet2にコピペしています。
罫線などはコピペできたのですが、
コントロールがうまくできません。

Excelマクロでは
    ActiveSheet.Ctrl1.Copy
    Range("A20").Paste
でコピペできるのですが、
.NETで同様のコードを書いてもコピペできませんでした。
    Dim Sht As Excel.Worksheet
    Sht.Ctr1.copy()
    Sht.Range("A20").Parse()

どうしたらいいでしょうか?

[ツリー表示へ]
タイトルRe: .NETからExcelを操作してコントロールをコピペするには
記事No6721
投稿日: 2007/12/25(Tue) 14:15
投稿者花ちゃん
> Excelマクロでは
>     ActiveSheet.Ctrl1.Copy
>     Range("A20").Paste
> でコピペできるのですが、

因みにExcelのバージョンとコピーしたいコントロール名は

Excelマクロでは 下記のような気がするのですが。

    ActiveSheet.Shapes("CommandButton1").Select
    Selection.Copy
    Range("A20").Select
    ActiveSheet.Paste

[ツリー表示へ]
タイトルRe^2: .NETからExcelを操作してコントロールをコピペするには
記事No6722
投稿日: 2007/12/25(Tue) 15:02
投稿者音羽
マクロをそのまま記録すると花ちゃんの提示したコードになりました。
(いろいろ触ってて混乱してきたみたいです。)
    ActiveSheet.Shapes("BarCodeCtrl1").Select
    Selection.Copy
    Range("A20").Select
    ActiveSheet.Paste

このコードを.NETでも試してみたのですがShapesのとろでひっかっかってしまいました。
.NETでも使えるように少し手を加えないとダメなのでしょうか?

環境、コントロールについては以下のとおりです。
環境:Windows Server 2003 R2 StandartEdition SP2 / Excel2003 / .NET2003
コントロール:MSバーコードコントロール
*---------*
バーコードコントロールについて情報リンク
http://takashixxx.blog88.fc2.com/blog-entry-23.html
*---------*

[ツリー表示へ]
タイトルRe^3: .NETからExcelを操作してコントロールをコピペするには
記事No6723
投稿日: 2007/12/25(Tue) 15:11
投稿者花ちゃん
> このコードを.NETでも試してみたのですがShapesのとろでひっかっかってしまいました。
> .NETでも使えるように少し手を加えないとダメなのでしょうか?

ここのExcel & Word 関係をご覧下さい。
http://hanatyan.sakura.ne.jp/dotnet/Excelflm.htm

[ツリー表示へ]
タイトルRe^4: .NETからExcelを操作してコントロールをコピペするには
記事No6725
投稿日: 2007/12/25(Tue) 15:36
投稿者音羽
削除

[ツリー表示へ]
タイトルRe^5: .NETからExcelを操作してコントロールをコピペするには
記事No6726
投稿日: 2007/12/25(Tue) 15:37
投稿者音羽
> ここのExcel & Word 関係をご覧下さい。
> http://hanatyan.sakura.ne.jp/dotnet/Excelflm.htm

すでに見せてもらいましたが、解決することはできませんでした。
今、改めて見てみましたがどこに解決のヒントがるのかよくわかりません。
申し訳ありませんが、具体的に示していただけませんでしょうか?

[ツリー表示へ]
タイトルRe^6: .NETからExcelを操作してコントロールをコピペするには
記事No6727
投稿日: 2007/12/25(Tue) 15:44
投稿者花ちゃん
> すでに見せてもらいましたが、解決することはできませんでした。
> 今、改めて見てみましたがどこに解決のヒントがるのかよくわかりません。
> 申し訳ありませんが、具体的に示していただけませんでしょうか?

その前にご自分が試したコードを投稿するのがスジでは。

Excel 起動から終了までを含めたコードを(多分、その辺も怪しそうなので)

[ツリー表示へ]
タイトルRe^7: .NETからExcelを操作してコントロールをコピペするには
記事No6728
投稿日: 2007/12/25(Tue) 16:09
投稿者音羽
> その前にご自分が試したコードを投稿するのがスジでは。
そうですね。解決へ焦っていました。
すいませんでした。

> Excel 起動から終了までを含めたコードを(多分、その辺も怪しそうなので)
以下実際のコードです。
※ただ、独自に定義してある関数集団(?)を利用しています。

【Excelオープン部分】
' BOOKを開く
bolRet = objExcel.OpenWorkbook("C:\TempBook.xls", False)
If bolRet = False Then
    エラーメッセージ表示後終了
End If
' シートの存在をチェックし,アクティブにする
bolRet = objExcel.SheetExists("Sheet1", True)
If bolRet = False Then
    エラーメッセージ表示後終了
End If
objExcel.AppExcel.Visible = False


【セルのコピペ部分】
Dim sht As Microsoft.Office.Interop.Excel.Worksheet = CType(objExcel.CurWorkbook.Sheets.Item("C:\tmp.xls"), Excel.Worksheet)
Dim toSht As Excel.Worksheet = CType(objExcel.CurWorkbook.ActiveSheet, Excel.Worksheet)
sht.Range("1:15").Copy()
toSht.Range("1:15").PasteSpecial(Excel.XlPasteType.xlPasteAll)


【終了部分】
objExcel.CloseWorkbook(True)
Call objExcel.CloseExcel()
objExcel = Nothing

※独自に定義してある関数集団(?)を利用しています。

[ツリー表示へ]
タイトルRe^8: .NETからExcelを操作してコントロールをコピペするには
記事No6729
投稿日: 2007/12/25(Tue) 16:23
投稿者花ちゃん
> 【セルのコピペ部分】
> Dim sht As Microsoft.Office.Interop.Excel.Worksheet = CType(objExcel.CurWorkbook.Sheets.Item("C:\tmp.xls"), Excel.Worksheet)
> Dim toSht As Excel.Worksheet = CType(objExcel.CurWorkbook.ActiveSheet, Excel.Worksheet)
> sht.Range("1:15").Copy()
> toSht.Range("1:15").PasteSpecial(Excel.XlPasteType.xlPasteAll)

マクロの内容と違うじゃないですか?
全体的に .NET でExcel を操作する場合問題の多いコードかと思います。

下記の内容を読むなり過去のログを参照するなりして、基本的な部分から作り直した方が
いいかと思います。
http://hanatyan.sakura.ne.jp/dotnet/Excelflm.htm

尚、投稿するなら、誰でも事象が再現できるコードを作って投稿された方が回答が
得られ易いかと思います。

[ツリー表示へ]
タイトルRe^9: .NETからExcelを操作してコントロールをコピペするには
記事No6731
投稿日: 2007/12/25(Tue) 21:42
投稿者音羽
> 全体的に .NET でExcel を操作する場合問題の多いコードかと思います。
そうなんですか。
基礎もない状態で見てるので特に違和感はなにも無しでした。

> 下記の内容を読むなり過去のログを参照するなりして、基本的な部分から作り直した方が
> いいかと思います。
これから勉強していきます。

> 尚、投稿するなら、誰でも事象が再現できるコードを作って投稿された方が回答が
> 得られ易いかと思います。
アドバイスありがとうございます。
今回は「独自に定義してある関数集団」の部分を自分で作り直すことができませんでした。
これから勉強していって自分でなんとかできるようになりたいです。

[ツリー表示へ]
タイトルRe^8: .NETからExcelを操作してコントロールをコピペするには
記事No6730
投稿日: 2007/12/25(Tue) 17:04
投稿者魔界の仮面弁士
> bolRet = objExcel.OpenWorkbook("C:\TempBook.xls", False)
> bolRet = objExcel.SheetExists("Sheet1", True)
> sht = CType(objExcel.CurWorkbook.Sheets.Item("C:\tmp.xls"), Excel.Worksheet)

OpenWorkbook も
SheetExists も
CurWorkbook も、いずれも Excel には存在しないプロパティですね。

つまり、objExcel というのは、Excel.Application の事では無く、
独自に生成したクラスなのですよね? すなわち、
> ※ただ、独自に定義してある関数集団(?)を利用しています。
である、と。

では、それらの独自処理の部分に問題が全く無い事を、確認されていますでしょうか?
(投稿されていない部分に問題があった場合、第三者はそれらを指摘できませんので)


それから、今回の「Shapes プロパティ」は、どのオブジェクトのプロパティとして
利用しようとされていますか? 少なくとも、
  VSTO の Microsoft.Office.Tools.Excel.Worksheet
 COMプライマリ相互運用アセンブリの Microsoft.Office.Interop.Excel.Worksheet
には、いずれも Shapes プロパティがあるかと思います。

[ツリー表示へ]
タイトルRe^9: .NETからExcelを操作してコントロールをコピペするには
記事No6732
投稿日: 2007/12/25(Tue) 21:48
投稿者音羽
> では、それらの独自処理の部分に問題が全く無い事を、確認されていますでしょうか?
> (投稿されていない部分に問題があった場合、第三者はそれらを指摘できませんので)
他のプログラムでは問題なく動作しているということなので大丈夫だと思います。

> それから、今回の「Shapes プロパティ」は、どのオブジェクトのプロパティとして
> 利用しようとされていますか? 少なくとも、
下のようにしてみました。
Dim sht As Microsoft.Office.Interop.Excel.Worksheet = CType(objExcel.CurWorkbook.Sheets.Item("C:\tmp.xls"), Excel.Worksheet)
sht.ActiveSheet
ActiveSheet.Shapes("BarCodeCtrl1").Select
Selection.Copy
Range("A20").Select
ActiveSheet.Paste

>  COMプライマリ相互運用アセンブリの Microsoft.Office.Interop.Excel.Worksheet
> には、いずれも Shapes プロパティがあるかと思います。
ということは上のコードで問題はないということでしょうか?

[ツリー表示へ]
タイトルRe^10: .NETからExcelを操作してコントロールをコピペするには
記事No6733
投稿日: 2007/12/26(Wed) 01:56
投稿者魔界の仮面弁士
ということはすなわち、
> Dim sht As Microsoft.Office.Interop.Excel.Worksheet = CType(objExcel.CurWorkbook.Sheets.Item("C:\tmp.xls"), Excel.Worksheet)
ここまでは、何の問題も無く実行される……という事だと思ってよいのですよね?

私の目には、"C:\tmp.xls" は(シートではなく)ブックを表す文字列に見えたため、
かなり奇妙なコードに映った(間違っているようにも感じられた)のですが、実際のところ、
objExcel などの仕様は全くわからないので、これが正しいかどうかは判定できず、
> 他のプログラムでは問題なく動作しているということなので大丈夫だと思います。
という、音羽さんの言葉をそのまま信じるしかなかったりします。


という事で、その次の行から見ていきますと。


> sht.ActiveSheet
これは間違っていると思いますよ。
普通は、Worksheet に ActiveSheet というメソッドは無いはずですから。

それとも、音羽さんの環境では Worksheet クラスに ActiveSheet メソッドがあるのですか?


> ActiveSheet.Shapes("BarCodeCtrl1").Select
それでは駄目ですよ。
この "ActiveSheet" という変数(?) のデータ型は何であり、
また、この変数(?)に値を代入している部分はどこだと思いますか?

たとえば VB の場合、別フォームの TextBox を操作しようとしたら、
 フォーム変数.TextBox1.Text = "AAA"
となりますが、フォーム内で、自分自身の TextBox を操作する場合は、
 TextBox1.Text = "AAA"
のように、フォーム名を省略して操作できますよね。

それと同じことで、Excel VBA の場合は、「Excel 自身」のオブジェクトに対しては、
いきなり ActiveSheet などから書き始める事ができますが、外部から操作する場合は、
「どの Excel の ActiveSheet なのか」を明らかにしなければならないのです。

(単に ActiveSheet だけだと、たとえば Excel を同時に複数起動して制御しようと
していた場合、どちらを制御すれば良いのか、わかりませんよね?)


> Selection.Copy
これも同様です。
この Selection という変数(?) のデータ型は何ですか?
また、この変数に値を代入している部分はどこですか?

VBA の場合は、Application 自身の Selection プロパティを意味しますが、
外部から操作する場合は、どのオブジェクトの Selection なのかを修飾して、
 〜.Selection.Copy
などとしなければなりません。
(より厳密に言えば、そもそも Active/Select系のメンバを使うべきでは無いのですが)


> Range("A20").Select
> ActiveSheet.Paste
これも同じ。
この Range や ActiveSheet といった(以下略)


> ということは上のコードで問題はないということでしょうか?
ということで、objExcel.CurWorkbook などの実装が何であれ、少なくとも
それ以降の行に関しては、明らかに間違っているかと思います。


また、冒頭の objExcel.CurWorkbook の行が正しいのかどうかについては、
「独自に定義してある関数集団」とやらの仕様が公開されていない以上、
正しいコードは、音羽さん自身が模索するしか無いと思います。
(もしくは独自関数を一切使わず、他の方でもわかる一般的な記述で書き直すか…)

[ツリー表示へ]