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

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

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

Re[4]: VS2008 C# にてVSTOにてセル範囲の指定方法


(過去ログ 74 を表示中)

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

■43519 / inTopicNo.1)  VS2008 C# にてVSTOにてセル範囲の指定方法
  
□投稿者/ msnr (1回)-(2009/11/11(Wed) 23:43:07)

分類:[C#] 

VSTOの勉強中です。
今まではVBAを使っていたのですが、そろそろVSTOに転向しようと
思うのですがオブジェクトモデルを見ても分かりにくく困っています。
以下のコードですが、簡単な内容で
ワークブックを開くとA列の1〜5行目まで各々の行数が入力され
閉じる直前にコンテンツをクリアするものです。


namespace ExcelWorkbook1
{
    public partial class Sheet1
    {
        private void Sheet1_Startup(object sender, System.EventArgs e)
        {
            long i = 1;

            MessageBox.Show("Try VSTO");
            do
            {
                this.Application.Cells[i , 1]=i+"行";
                i++ ;
            }while(i <= 5);
        }

        private void Sheet1_Shutdown(object sender, System.EventArgs e)
        {
     /// ここでA列1〜5行の文字列をクリアしたいのです。
        }

3行上でクリアしたいのですが、ループ処理を使わずクリアしたいのです。
いわゆるVBAで言う
Excel.Worksheets1.Cells(Worksheets1.Cells(1,1),Worksheets1.Cells(1,5)).Clear
や
Excel.Worksheets1.Range("A1:A5").Clear

の様な記述はどの様にすれば良いのでしょうか?

経験浅く、分かり難い質問ですが識者の皆様、ご教授下さい。

よろしくお願いいたします。

引用返信 編集キー/
■43520 / inTopicNo.2)  Re[1]: VS2008 C# にてVSTOにてセル範囲の指定方法
□投稿者/ msnr (2回)-(2009/11/11(Wed) 23:51:50)
すいません、書き忘れました。

開発環境は VS2008 Professional
使用OSは  Windows XP Professional
Officeは  2007 Professionalです。
引用返信 編集キー/
■43523 / inTopicNo.3)  Re[1]: VS2008 C# にてVSTOにてセル範囲の指定方法
□投稿者/ 裕猫 (49回)-(2009/11/12(Thu) 08:37:46)
No43519 (msnr さん) に返信
> VSTOの勉強中です。
> 今まではVBAを使っていたのですが、そろそろVSTOに転向しようと
> 思うのですがオブジェクトモデルを見ても分かりにくく困っています。
> 以下のコードですが、簡単な内容で
> ワークブックを開くとA列の1〜5行目まで各々の行数が入力され
> 閉じる直前にコンテンツをクリアするものです。
>
>
> namespace ExcelWorkbook1
> {
> public partial class Sheet1
> {
> private void Sheet1_Startup(object sender, System.EventArgs e)
> {
> long i = 1;
>
> MessageBox.Show("Try VSTO");
> do
> {
> this.Application.Cells[i , 1]=i+"行";
> i++ ;
> }while(i <= 5);
> }
>
> private void Sheet1_Shutdown(object sender, System.EventArgs e)
> {
>      /// ここでA列1〜5行の文字列をクリアしたいのです。
> }
>
> 3行上でクリアしたいのですが、ループ処理を使わずクリアしたいのです。
> いわゆるVBAで言う
> Excel.Worksheets1.Cells(Worksheets1.Cells(1,1),Worksheets1.Cells(1,5)).Clear
> や
> Excel.Worksheets1.Range("A1:A5").Clear
>
> の様な記述はどの様にすれば良いのでしょうか?
>
> 経験浅く、分かり難い質問ですが識者の皆様、ご教授下さい。
>
> よろしくお願いいたします。
ループを使いたくないのはなぜでしょう?行数が多くなるからでしょうか?私も聞くことが多い身なので回答はないのですが、もし文字数
を気にするのでしたら
> do
> {
> this.Application.Cells[i , 1]=i+"行";
> i++ ;
> }while(i <= 5);

for(int i = 0; i <= 5; i++)
{
this.Application.Cells[i , 1]=i+"行";
}
という書き方があります。
while(i <= 5)
{
this.Application.Cells[i , 1]=i+"行";
i++ ;
}
でもいい。ほんの少しですが文字数減らせます。たわごと程度の参考にどうぞ。
引用返信 編集キー/
■43535 / inTopicNo.4)  Re[1]: VS2008 C# にてVSTOにてセル範囲の指定方法
□投稿者/ 魔界の仮面弁士 (1385回)-(2009/11/12(Thu) 11:12:07)
No43519 (msnr さん) に返信
> 思うのですがオブジェクトモデルを見ても分かりにくく困っています。
オブジェクトモデル自体は、VBA と殆ど一緒なのですが、
 ・Optional 引数
 ・名前付き引数
 ・引数付きプロパティ
などが、現行バージョンの C# では使えないので、
言語制限上、VB.NET/VBA とは多少異なる構文になりがちですね。


> ワークブックを開くとA列の1〜5行目まで各々の行数が入力され
ブック上の、どのシートのA列でしょうか。

今回の場合、Sheet1 のイベントを使っているのですから
「アクティブなシート」ではなく、「Sheet1」を対象にするのですよね?
だとしたら、Application.Cells ではなく、this.Cells を使うべきかと。

> Excel.Worksheets1.Range("A1:A5").Clear
VB.NET であればそのようにも指定できますが、C# では第2引数の省略が出来ないので、
 〜.Range["A1:A5", System.Type.Missing].Clear();
とする事になります。もしくは、
 〜.Range["A1", "A5"].Clear();
という書き方もできますね。
引用返信 編集キー/
■43593 / inTopicNo.5)  Re[2]: VS2008 C# にてVSTOにてセル範囲の指定方法
□投稿者/ msnr (3回)-(2009/11/13(Fri) 00:44:58)
No43535 (魔界の仮面弁士 さん) に返信

> 今回の場合、Sheet1 のイベントを使っているのですから
> 「アクティブなシート」ではなく、「Sheet1」を対象にするのですよね?
> だとしたら、Application.Cells ではなく、this.Cells を使うべきかと。
> 
>>Excel.Worksheets1.Range("A1:A5").Clear
> VB.NET であればそのようにも指定できますが、C# では第2引数の省略が出来ないので、
>  〜.Range["A1:A5", System.Type.Missing].Clear();
> とする事になります。もしくは、
>  〜.Range["A1", "A5"].Clear();
> という書き方もできますね。

魔界の仮面弁士 さん、ありがとうございます。
ごもっともです。すごく勉強になります!!

処理に関しては
this.Range["A1:A5", System.Type.Missing].Clear();
こちらで処理できました。
もちろん〜.Range["A1", "A5"].Clear();でも出来ましたが。
今後C#を勉強していくので前者のC#らしい記述でまずは勉強です。

裕猫さんもありがとうございます!!
>ループを使いたくないのはなぜでしょう?行数が多くなるからでしょうか?私も聞くこと
>が多い身なので回答はないのですが、もし文字数を気にするのでしたら

こちらに関しては、特にコーディングの量にはまだ意識してないのですが
例えば、下記の例でいくと
do
{
    this.Application.Cells[i , 1]=i+"行";
    i++ ;
}while(i <= 5);
このままのソースならたかだか5回ループするだけなので
Excel.Rangeオブジェクトへのアクセス回数は5回となりますが

}while(i <= 10000);

となった時は、アクセス回数は10000回となりますので非常に
鈍足な処理となってしまうかと思い、この様に考えました。

for,Whileステートメントのご指南ありがとうございます!!
これから徐々に色々覚えながら頑張ります!!

もうひとつ教えてください!!
VSTOに関する書籍は調べてもあまり無いのですが、もし何かお勧めがあれば
ご紹介頂けないでしょうか?
よろしくお願いします!!

しかしC#言語とは、何かとVB6.0に比べてスマートにコードが出来るように
感じます。

# 個人的にはVB/VB.NETのWith句は非常に好きなのですが・・・・

引用返信 編集キー/
■43599 / inTopicNo.6)  Re[3]: VS2008 C# にてVSTOにてセル範囲の指定方法
□投稿者/ 裕猫 (50回)-(2009/11/13(Fri) 09:02:25)
No43593 (msnr さん) に返信
> ■No43535 (魔界の仮面弁士 さん) に返信
>
>>今回の場合、Sheet1 のイベントを使っているのですから
>>「アクティブなシート」ではなく、「Sheet1」を対象にするのですよね?
>>だとしたら、Application.Cells ではなく、this.Cells を使うべきかと。
>>
> >>Excel.Worksheets1.Range("A1:A5").Clear
>>VB.NET であればそのようにも指定できますが、C# では第2引数の省略が出来ないので、
>> 〜.Range["A1:A5", System.Type.Missing].Clear();
>>とする事になります。もしくは、
>> 〜.Range["A1", "A5"].Clear();
>>という書き方もできますね。
>
> 処理に関しては
> this.Range["A1:A5", System.Type.Missing].Clear();
> こちらで処理できました。
> もちろん〜.Range["A1", "A5"].Clear();でも出来ましたが。
> 今後C#を勉強していくので前者のC#らしい記述でまずは勉強です。
>
> こちらに関しては、特にコーディングの量にはまだ意識してないのですが
> 例えば、下記の例でいくと
> do
> {
> this.Application.Cells[i , 1]=i+"行";
>  i++ ;
> }while(i <= 5);
> このままのソースならたかだか5回ループするだけなので
> Excel.Rangeオブジェクトへのアクセス回数は5回となりますが
>
> }while(i <= 10000);
>
> となった時は、アクセス回数は10000回となりますので非常に
> 鈍足な処理となってしまうかと思い、この様に考えました。
>
確かにおっしゃるとうりですね。Clearの使い方大変参考になりました。ありがとうございます。

> もうひとつ教えてください!!
> VSTOに関する書籍は調べてもあまり無いのですが、もし何かお勧めがあれば
> ご紹介頂けないでしょうか?
> よろしくお願いします!!
>
私も浅学ゆえ紹介できないのですが、同じくBASICから来た身なので共に学んでいきたいと思います。おたがいに頑張りましょう。
引用返信 編集キー/
■43625 / inTopicNo.7)  Re[4]: VS2008 C# にてVSTOにてセル範囲の指定方法
□投稿者/ msnr (4回)-(2009/11/13(Fri) 18:49:41)
No43599 (裕猫 さん) に返信
> 私も浅学ゆえ紹介できないのですが、同じくBASICから来た身なので共に学んでいきたいと思います。おたがいに頑張りましょう。

ありがたいお言葉、感謝いたします。
また何か機会が有りましたら、ご助力ください!!

それでは裕猫さん、魔界の仮面弁士さん ありがとうございました。

今後ともよろしくお願いします。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -