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

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

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

Re[4]: VB.NETでExcel操作について


(過去ログ 14 を表示中)

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

■4393 / inTopicNo.1)  VB.NETでExcel操作について
  
□投稿者/ ゆっきー (51回)-(2007/06/15(Fri) 17:13:25)

分類:[VB.NET (Windows)] 

[環境]VB.NET2005 Excel2000(MS Excel 9.0 Object Library)

VB.NETでExcelにデータを出力する(帳票)処理をしています。
帳票で、N列になるデータがあるので、
Excelのテンプレートには基本となる列(例えばA列)を用意し、
必要な列数だけその列(A列)をコピーし、
B列C列D列…に貼り付けるということをしようとしています。

A列(1列)をコピーしていく、というのは下記コードでできました。

'列コピー
CType(xlsSheet.Columns(intCol), Excel.Range).Select()
CType(xlsSheet.Application.Selection, Excel.Range).Copy()

'列貼り付け
CType(xlsSheet.Columns(strColumn), Excel.Range).Select()
xlsSheet.Paste()

※intCol:コピー元の列
※strColumn:コピー先の列
※列は「A,B,C」ではなく「1,2,3」です。

しかし、A列〜C列(N列)をD列〜F列にコピーというのが
いまいちうまくいきません。

下記コードで試したのですがうまくいきませんでした。

'列コピー
CType(xlsSheet.Columns(intColFrom & ":" & intColTo), Excel.Range).Select()

※intColFrom:コピー元の列開始位置
※intColTo:コピー元の列終了位置
※エラーメッセージ:「HRESULからの例外:0800A03EC」

何かお分かりになられましたらご教授ください。
お願いいたします。
引用返信 編集キー/
■4394 / inTopicNo.2)  Re[1]: VB.NETでExcel操作について
□投稿者/ 片桐 (19回)-(2007/06/15(Fri) 17:45:22)
えーっと問題は、Cの構文というよりは、EXCELの列の特定の仕方だと思います。

行列オブジェクトの数字は、指定された範囲で何番目の列、の意味で使いますので以下のようにかけます。

columns(1).select
rows(2).select

が、ここからここまでの列、という範囲を指定したい場合は、

columns("A:B").select

と、文字をつかってあげないと、EXCELでは列の複数指定がききません。

これは、EXCELでは、A1、AB21、とアルファベットで行列を指定できる仕組みになっていて
文字部分が列を指し、数字部分が行を指しているからです。

なので列を名前で指定する場合には文字になります。
行で数字表記、 rows("1:2").select と書けるのはそういう理由からで、
何番目から何番目を指しているのではなく、1という名前から2という名前まで、を指しています。

これで、解決できるかと思いますです。


引用返信 編集キー/
■4395 / inTopicNo.3)  Re[2]: VB.NETでExcel操作について
□投稿者/ ゆっきー (52回)-(2007/06/15(Fri) 18:01:29)
No4394 (片桐 さん) に返信
返信ありがとうございます。

> なので列を名前で指定する場合には文字になります。
> 行で数字表記、 rows("1:2").select と書けるのはそういう理由からで、
> 何番目から何番目を指しているのではなく、1という名前から2という名前まで、を指しています。
>
> これで、解決できるかと思いますです。

A列〜C列をN回コピーしていくので、
(1回目はD列〜F列、2回目はG列〜I列…N回目は?列〜?列)
列の位置を文字で指定することができないので
数値を使用してコピーしていこうと考えていました。

列を文字ではなく列位置でN列指定し
コピーする方法はないのでしょうか。

よろしくお願いします。
引用返信 編集キー/
■4396 / inTopicNo.4)  Re[3]: VB.NETでExcel操作について
□投稿者/ とりこびと (26回)-(2007/06/15(Fri) 18:09:43)
とりこびと さんの Web サイト
こんにちは。とりこびとです。

No4395 (ゆっきー さん) に返信

> A列〜C列をN回コピーしていくので、
> (1回目はD列〜F列、2回目はG列〜I列…N回目は?列〜?列)
> 列の位置を文字で指定することができないので
> 数値を使用してコピーしていこうと考えていました。
>
> 列を文字ではなく列位置でN列指定し
> コピーする方法はないのでしょうか。
>
> よろしくお願いします。

数値から文字列を組み立ててから・・・とかってのはダメでしょうか?

引用返信 編集キー/
■4401 / inTopicNo.5)  Re[4]: VB.NETでExcel操作について
□投稿者/ 片桐 (20回)-(2007/06/15(Fri) 19:52:36)
列を表す数字を、文字列に変換……になりますね。
今ロジックがすぐ出てこないのですが、
確か私も数字から文字への変換関数を自作しました。

A〜Z、AA〜AZ、BA〜BZ、CA〜CZ……でIVまでで、使用する列の範囲が明確なのであれば
配列で持って参照してしまうとか(汗)
引用返信 編集キー/
■4402 / inTopicNo.6)  Re[5]: VB.NETでExcel操作について
□投稿者/ 片桐 (21回)-(2007/06/15(Fri) 19:55:15)
あ、あともう一個、これは発想の転換なんですが、

3列を選択してコピー、
その後、貼り付けの最初の列だけを選択してペーストってしても
EXCELは3列分コピーしてくれます。

この動きを応用すれば、指定は1列だけでも可能なはず(大汗)
引用返信 編集キー/
■4403 / inTopicNo.7)  Re[3]: VB.NETでExcel操作について
□投稿者/ 魔界の仮面弁士 (306回)-(2007/06/15(Fri) 20:33:28)
2007/06/15(Fri) 20:45:45 編集(投稿者)

説明の都合上、以下のコード中では、COM オブジェクト解放( Marshal.ReleaseComObject メソッド) の
処理については無視して書いています。実際のコードでは、適宜、解放処理を含めてください。


No4395 (ゆっきー さん) に返信
> 列を文字ではなく列位置でN列指定し
> コピーする方法はないのでしょうか。

たとえば、"複数列指定"においては、
 rng = .Columns( "C:E" )
はできても、
 rng = .Columns( "3:5" )
のような指定は行えません。(たとえ R1C1 モードに設定したとしても)

しかし、"単一列指定"であれば、
 rng1 = .Columns( 3 )
 rng2 = .Columns( 5 )
のように数値を指定できますので、それを使って
 rng = .Range( rng1, rng2)
などとすれば、目的の範囲を得ることができます。


あるいは、Application クラスの ConvertFormula メソッドを用いれば、
R1C1 形式と A1 形式の切り替えが簡単に行えますので、それを使うのも良いかと。


また、限定された状況下においては、
 rngBase = .Columns( "A:C" )
 rngTarget = rngBase.Offset(0, 5) '← 右に5列ずれた "F:H" の範囲を返す
のように、Offset プロパティを利用できる場面もあるかと思います。
引用返信 編集キー/
■4437 / inTopicNo.8)  Re[4]: VB.NETでExcel操作について
□投稿者/ 中博俊 (1095回)-(2007/06/18(Mon) 09:12:06)
中博俊 さんの Web サイト
片桐さん
2007から列はXFDまであります。
引用返信 編集キー/
■4439 / inTopicNo.9)  Re[5]: VB.NETでExcel操作について
□投稿者/ 片桐 (22回)-(2007/06/18(Mon) 10:21:09)
No4437 (中博俊 さん) に返信
> 片桐さん
> 2007から列はXFDまであります。

>なかせんせ
うわ……たくさんのセルが扱えるようになったのですね……
ありがとうございますです。
引用返信 編集キー/
■4444 / inTopicNo.10)  Re[4]: VB.NETでExcel操作について
□投稿者/ ゆっきー (53回)-(2007/06/18(Mon) 11:56:58)
とりこびとさん、片桐さん、魔界の仮面弁士さん、中さん

みなさん返信ありがとうございます。

数値から文字列を組み立てると処理が複雑になりそうなので、
魔界の仮面弁士さんの
> たとえば、"複数列指定"においては、
>  rng = .Columns( "C:E" )
> はできても、
>  rng = .Columns( "3:5" )
> のような指定は行えません。(たとえ R1C1 モードに設定したとしても)
>
> しかし、"単一列指定"であれば、
>  rng1 = .Columns( 3 )
>  rng2 = .Columns( 5 )
> のように数値を指定できますので、それを使って
>  rng = .Range( rng1, rng2)
> などとすれば、目的の範囲を得ることができます。
を参考にしたいと思います。
これだと?列〜?列の範囲だけでなく、
?:?セルから?:?セルの範囲にも応用できそうだからです。

また、COM オブジェクト解放の処理も含めています。
(vb.netのExcelについてググるとよく目にするので)

ありがとうございました。


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


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

このトピックに書きこむ

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

管理者用

- Child Tree -