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

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

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

Re[5]: vb.net2005にてExcelシートを操作し、行のコピペ


(過去ログ 125 を表示中)

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

■74701 / inTopicNo.1)  vb.net2005にてExcelシートを操作し、行のコピペ
  
□投稿者/ 優希(ゆき) (38回)-(2015/01/23(Fri) 15:47:40)

分類:[VB.NET/VB2005 以降] 

環境 Win7
言語 vb2005
Office 2007

vb2005からExcelを操作してテンプレートにデータを入れて出力させるコードを書いています。
その際に、データ行の先頭をコピーして、挿入するデータ分の行の挿入を行いたいです。(セルが多く、Excelから書式設定より行コピーの方が早いため)


サンプルで一行のみコピペの下記コードを実行した所、挿入箇所の結合セルが原因で「結合されたセルの一部を変更することは出来ません。」
と出てCOMExceptionが発生してしまいます。

xlSheet.Range("a4:aj4").Copy(Destination:=xlSheet.Range("a5:aj5"))


この方法は間違っているのでしょうか?

間違っているのであれば、別の方法を教えて下さい。

Excelでは行コピー→コピーしたセルの挿入を行えば、結合セルでも問題なく行の挿入が出来ました。
引用返信 編集キー/
■74707 / inTopicNo.2)  Re[1]: vb.net2005にてExcelシートを操作し、行のコピペ
□投稿者/ shu (674回)-(2015/01/24(Sat) 10:30:13)
No74701 (優希(ゆき) さん) に返信
>
> xlSheet.Range("a4:aj4").Copy(Destination:=xlSheet.Range("a5:aj5"))
>
>
行コピーなら範囲を行にした方がよいかと思います
a4:aj4 => 4:4
or
Rows(4)

コピーした行を挿入の動作をする場合
(1)コピー行.Copy()
(2)挿入先.Insert()
で行わないと同じ動作とは言えません。
引用返信 編集キー/
■74723 / inTopicNo.3)  Re[2]: vb.net2005にてExcelシートを操作し、行のコピペ
□投稿者/ 優希(ゆき) (39回)-(2015/01/26(Mon) 13:30:09)
No74707 (shu さん) に返信
> ■No74701 (優希(ゆき) さん) に返信
>>
> 行コピーなら範囲を行にした方がよいかと思います
> a4:aj4 => 4:4
> or
> Rows(4)
>
> コピーした行を挿入の動作をする場合
> (1)コピー行.Copy()
> (2)挿入先.Insert()
> で行わないと同じ動作とは言えません。


上を参考にして、下記コードに書き換えた所
Dim xlRange As Excel.Range = Nothing
Dim R As Excel.Range = Nothing


xlRange = xlSheet.Range("4:36")

R = xlSheet.Range("5:36")

xlRange.Copy()
R.Insert() 

最後の行で「COMExceptionが発生しました。 この選択は正しくありません。いくつかの理由が考えられます。」

と出てきます。




引用返信 編集キー/
■74724 / inTopicNo.4)  Re[3]: vb.net2005にてExcelシートを操作し、行のコピペ
□投稿者/ shu (676回)-(2015/01/26(Mon) 13:39:29)
No74723 (優希(ゆき) さん) に返信
> xlRange = xlSheet.Range("4:36")
>
> R = xlSheet.Range("5:36")
>
> xlRange.Copy()
> R.Insert() 
>
> 最後の行で「COMExceptionが発生しました。 この選択は正しくありません。いくつかの理由が考えられます。」
>
> と出てきます。
>
これをExcel上で行うとすると
(1)4行目から36行目までを選択してコピー
(2)5行目から36行目までを選択してコピーしたセルの挿入
となり実際に操作を行ってもらうとわかりますがエラーメッセージが表示されます。
xlRange = xlSheet.Range("4:36") => xlRange = xlSheet.Range("4:4")
または
R = xlSheet.Range("37:37")
なら大丈夫だと思います。


引用返信 編集キー/
■74725 / inTopicNo.5)  Re[4]: vb.net2005にてExcelシートを操作し、行のコピペ
□投稿者/ 優希(ゆき) (40回)-(2015/01/26(Mon) 13:49:41)
No74724 (shu さん) に返信

> xlRange = xlSheet.Range("4:36") => xlRange = xlSheet.Range("4:4")


こちらのコードに変更して実行した所、挿入する列に結合セルがあっても
挿入することが出来ました。

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

動いたソースは下記になります。

xlRange = xlSheet.Range("4:4")

R = xlSheet.Range("5:5")

xlRange.Copy()
R.Insert()


また、一つ疑問がありまして、Excelでは行全体にカーソルが入り、コピーやら挿入すると思うのですが、
上記処理だと、一番先頭のセルしか選択されていないと思いますが、何故この範囲指定でコピーや挿入が可能なのでしょうか?


引用返信 編集キー/
■74726 / inTopicNo.6)  Re[5]: vb.net2005にてExcelシートを操作し、行のコピペ
□投稿者/ shu (677回)-(2015/01/26(Mon) 13:56:18)
No74725 (優希(ゆき) さん) に返信

> また、一つ疑問がありまして、Excelでは行全体にカーソルが入り、コピーやら挿入すると思うのですが、
> 上記処理だと、一番先頭のセルしか選択されていないと思いますが、何故この範囲指定でコピーや挿入が可能なのでしょうか?
>
Excelのセル指定文字列は
4:4 => 4行目全体
A:A => A列全体
のように行、列の指定文字が片方しかない場合は全体を表現します
ので先頭のセルということではないです。
先の4:36だと4行目から36行目までという指定になります。
引用返信 編集キー/
■74727 / inTopicNo.7)  Re[5]: vb.net2005にてExcelシートを操作し、行のコピペ
□投稿者/ 魔界の仮面弁士 (204回)-(2015/01/26(Mon) 14:02:53)
No74725 (優希(ゆき) さん) に返信
> また、一つ疑問がありまして、Excelでは行全体にカーソルが入り、コピーやら挿入すると思うのですが、
> 上記処理だと、一番先頭のセルしか選択されていないと思いますが、何故この範囲指定でコピーや挿入が可能なのでしょうか?


「一番先頭のセル」ではなく、「行全体」を表しています。

もしも「行の先頭のセル」を表したいのであれば、それは
 .Cells(4, 1)
 .Range("A4")
 .Range("R4C1")
といった表現になります。

ワークシートに対する .Range("4:4") 操作は、
.Rows(4) や .Rows("4:4") に相当する処理です。
これらはすべて、「4 行目全体」を表すための表現です。

※もしも Worksheet オブジェクトの Range プロパティではなく、
 Range オブジェクトの Range プロパティを使っている場合は、
 行全体を現すために、EntireRow プロパティが併用されます。


Excel のツールバーと、ワークシートの間にある欄の、
左端にあるドロップダウン「名前ボックス」に、
『4:4』という文字列を入力して Enter してみてください。
4行目全体が選択状態になるはずです。
引用返信 編集キー/
■74729 / inTopicNo.8)  Re[6]: vb.net2005にてExcelシートを操作し、行のコピペ
□投稿者/ 優希(ゆき) (42回)-(2015/01/26(Mon) 14:22:03)
No74727 (魔界の仮面弁士 さん) に返信
No74726 (shu さん) に返信

セル番地のどちらか片方しかない場合は、行か列の全体を指定することになるんですね。

また、魔界の仮面弁士さんがExcelでもできるということで、やってみたところ、そのとおりに実行されました。


お二人の回答ありがとうございました。

また何かありましたら、よろしくお願いします。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -