こんにちは良です。VB.NET
でエクセル起動はできたのですが
シートが一つしか出ないで複数のシートが出ません。
複数のシートを出してエクセルを起動するには
どうしたらいいでしょうか?
Dim NewSheets As Object = xlSheets.Add(Count:=?, after:=xlSheet)
としたんですがやっぱり一つしか出なかったです。
どのように起動して、どのようにシート数を指定しているのかなど、
実際にやっている処理内容を、もっと具体的に書いてみてくだあい。
> シートが一つしか出ないで複数のシートが出ません。
複数のシートが出ないというのは、具体的にはどういう状態なのでしょうか?
新規ブック作成時に、ワークシートが1枚しか含まれないという意味だとしたら、
Excelの[ツール]-[オプション]メニューから[全般]-[新しいブックのシート数]の
設定を変更すれば、新規ブックのシート数が変化します。(SheetsInNewWorkbook)
Dim xlApp As New Excel.Application
Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
'新規のファイルを開く場合
Dim xlBook As Excel.Workbook = xlBooks.Add
Dim xlSheets As Excel.Sheets = xlBook.Worksheets
Dim xlSheet As Excel.Worksheet = xlSheets.Item(1)
Dim NewSheet As Object = xlSheets.Add(Count:=4, after:=xlSheet)
xlApp.Visible = True 'Excelを表示
MRComObject(xlSheet) 'xlSheet の解放
MRComObject(xlSheets) 'xlSheets の解放
xlBook.Close(False) 'xlBook を閉じる
MRComObject(xlBook) 'xlBook の解放
MRComObject(xlBooks) 'xlBooks の解放
xlApp.Quit() 'Excelを閉じる
MRComObject(xlApp) 'xlApp を解放
MRComObject(NewSheet) ’ExcelSheetの解放
なんですが魔界の仮面弁士さんの言うようにエクセルを起動したときに
ワークシートが一枚しか出ないんですよ。
最終的にはデータベースからデータを取ってそのデータのフィールドの数
だけシートを追加したいんですよ。ですから起動したときにエクセルに
取ってきたデータを貼り付けるんですがフィールドの数だけシートを
追加することはできるでしょうか?
# こちらでは再現しなかったので、もう少し逆質問させてください。
> エクセルを起動したときに
『エクセルを起動したとき』とは、どの時点の事を指していますか?
1. Excel.Application のインスタンスを生成したとき
2. Workbooks の Add メソッドを引数なし/引数ありで呼び出した時
3. Sheets の Add メソッドを呼び出した時
4. Visible = True にして表示させたとき
5. 作成して保存した *.xls ファイルをユーザーが開いたとき
6. その他
> ワークシートが一枚しか出ないんですよ。
それは『ワークシート』限定であり、他形式のシートを追加した場合には
複数枚表示されるという事でしょうか。それともシートの種類は無関係なのでしょうか。
また、「一枚しか出ない」というのは、複数シートあるのに、それらが
非表示状態(xlSheetVeryHidden もしくは xlSheetHidden 状態)だという
事でしょうか。それとも、xlSheets.Count が 1 を返すという事でしょうか。
また、その件に関して、先に回答した
>> Excelの[ツール]-[オプション]メニューから[全般]-[新しいブックのシート数]の
>> 設定を変更すれば、新規ブックのシート数が変化します。(SheetsInNewWorkbook)
については、どのように設定しているのでしょうか?
> フィールドの数だけシートを追加することはできるでしょうか?
Excelで『フィールド』というと……ピボットテーブルか何かでしょうか。
フィールドの数というのは何の事かわかりませんが、シートの追加自体は、
(Worksheetsの)Addメソッドでいけるはずなので、プログラムの手順に
関しては、特に問題ないと思いますよ。
> MRComObject(xlSheet) 'xlSheet の解放
これらは、引数で渡したオブジェクトを解放するための処理なのでしょうか?
お返事ありがとうございます。
<4. Visible = True にして表示させたとき>
です。そのときにエクセルにはシートが一枚しか
出なかったんですよ。
>> Excelの[ツール]-[オプション]メニューから[全般]-[新しいブックのシート数]の
>> 設定を変更すれば、新規ブックのシート数が変化します。(SheetsInNewWorkbook)
>>については、どのように設定しているのでしょうか?
シート数は「3」に設定されていましたよ。
>>Excelで『フィールド』というと……ピボットテーブルか何かでしょうか。
間違えました。フィールドじゃなくてレコードです。
レコードはデータベースから取ってきたものです。
Records.(1 to ?).Value=シート(1 to ?(一枚ずつ))
みたいなイメージです。たぶんこれじゃできないと思うのですが。
あとすみません。ピポットテーブルとは何でしょうか?
> MRComObject(xlSheet) 'xlSheet の解放
これらは、引数で渡したオブジェクトを解放するための処理なのでしょうか?
そうです。オブジェクトを解放するための処理です。
<また、「一枚しか出ない」というのは、複数シートあるのに、それらが
<非表示状態(xlSheetVeryHidden もしくは xlSheetHidden 状態)だという
<事でしょうか。
すみません。この状態はちょっとわからないです・・・
それはどこでも設定していないので・・・
> あとすみません。ピポットテーブルとは何でしょうか?
こういう物です。
http://hp.vector.co.jp/authors/VA014071/tips/xl_pvt1.html
http://office.microsoft.com/ja-jp/results.aspx?Scope=RC&Query=%E3%83%94%E3%83%9C%E3%83%83%E3%83%88%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB
> すみません。この状態はちょっとわからないです・・・
で、実際の状態はどうなっていましたでしょうか。
提示されたサンプルでいえば、
xlApp.Visible = True 'Excelを表示
の直後に、xlSheets.Count の値が幾つになっているかを調べてください。
それが 1 を返すようならば、
> それとも、xlSheets.Count が 1 を返すという事でしょうか。
という話になりますが、この場合は Add メソッドが失敗している場合ぐらいしか
今のところ思いつきません。m(_ _;)m
(On Error や Try ステートメントなどで、例外が潰されていませんか?)
その逆に、Count プロパティが 2 以上の値を返すようであれば、
> 複数シートあるのに、それらが非表示状態
となっている可能性があります。この場合は、それぞれの Sheet を列挙して、
それぞれのシートの Visible プロパティの値を確認してみてください。もしそれらが、
xlSheetVisible 以外(xlSheetVeryHidden/xlSheetHidden)を返してくるようであれば、
何らかの理由(アドイン、自動起動マクロ、コーディングミス等)によって、
シートが非表示になっているのかも知れません。
あるいは、Count が 2 以上を返し、非表示になっているシートも無いにも関わらず、
画面上では 1 シートしか見えていないようであれば…あやまって、プログラムで
制御しているのとは無関係のExcelインスタンスをチェックしているのかも知れません。
解放漏れの Excel が残っていないか確認し、もし残っているようであれば、Windows を
再起動して、再度チェックしなおしてみてください。
関連あるスレッドはスレッドのアドレスを書込み、リンクを貼ります。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200606/06060017.txt
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200606/06060031.txt
結局、どんなオブジェクトを使って検索できたか?書いて無いので、いきなり
レコードだのフィールドだの言っても分かりません。スレッドに書いてない事は
分かりません。他のスレッドに書いてあっても、いちいち全てのスレッドを
チェックしてるわけでは無いので、スレッド内で完結する書き方を心掛けて
ください。
>Records.(1 to ?).Value=シート(1 to ?(一枚ずつ))
・Records って何ですか?コードを書く場合は正確なオブジェクト名を
記述してください。根拠なしに書くと回答者が混乱します。
・右辺と左辺は逆っぽい(?)です。
・複数のシートに自動で書込んでくれる機能は無いと思います。
少なくとも、花ちゃんのサイトを知っているのであれば、エクセルに
関して基本的な操作は、関連するサンプルを実行することで
もう少しできることの予想が付くはずです。
自分が実現できる基本的なプログラムから始めてください。
><4. Visible = True にして表示させたとき>
>です。そのときにエクセルにはシートが一枚しか
>出なかったんですよ。
スタートメニューのエクセルのアイコンから手作業で
エクセルを立ち上げた時はどうですか?
もし、3シートになってるなら、プログラムからも
同じ操作をしてるだけなので、3シートになるのが
正解。ならないのなら何か間違った操作をプログラム
から実行しています。
もし、手作業でも1シートだったり、正常な表示に
ならないのであれば、魔界の仮面弁士さんご指摘の通り、
解放漏れの可能性が高いです。
コードで
> Dim NewSheet As Object = xlSheets.Add(Count:=4, after:=xlSheet)
は、とりあえずコメントにして置いてください。
その他、花ちゃんさんのサイトのサンプルを、そのまま
実行して、正常な動作を確認してから次のステップに
進んでください。問題のあるコードを改造しても問題は
なくなりません。
もう一度、
http://www.bcap.co.jp/hanafusa/dotnet/Excelflm.htm
エクセルが終了しない理由を確認してください。
間違った終了方法でプロセスが残ってしまった時、どういう
確認方法があるか?も書いてあります。
こんばんは良です。早速回答ありがとう
ございますm(__)m
魔界の仮面弁士さん>
ちょっとステップ実行して見て値がちゃんと入っているのか
確認して見ます。ありがとうございます。
特攻隊長まるちうさん>
そうですね。すみませんでした。ちゃんとこのスレッド
で完結させるような書き方をします。
>Records.(1 to ?).Value=シート(1 to ?(一枚ずつ))
は私が想像で書いたコードです。混乱させてしまいすみませんでした。
もう一回エクセルを操作して、そして花ちゃんさんのサイトのコードを
そのまま実行してみます。私自身もちょっと混乱しているみたいなので
もう一度整理しからわからないところを質問いたします。
ご回答ありがとうございましたm(__)m
おはようございます。良です。
すみません。画面サイズが大きすぎてはみ出ていました。
画面を小さくしたらちゃんとシートが3枚生成されていました。
ツイート | ![]() |