- PR -

Excel VBA 配列のセル貼り付けエラーについて

投稿者投稿内容
電波くん
会議室デビュー日: 2003/10/30
投稿数: 11
お住まい・勤務地: 東京都千代田区
投稿日時: 2006-02-01 18:59
Excel VBAにて、ご質問があります。

配列中のデータを一度にセル(セル範囲)へ貼り付ける(設定する)処理を行っています。

処理のイメージとしては、Excelシートにコマンドボタンを貼り付けて、
クリックイベントで以下のような処理を行っています。

コード:
Dim obj(1 To 2, 1 To 1) As Variant
Dim str As String
Dim i As Long
str = ""
'91を92に変更すると★の箇所でエラー発生
For i = 1& To 91&
  str = str & "1234567890"
Next i
obj(1, 1) = "'hoge"
obj(2, 1) = str
Range("a1:a2") = obj '★

サンプルコード中にもありますように、
配列中の文字列がある一定の文字数(バイト数?)を超えると以下のエラーが発生してしまいます。

引用:
実行時エラー '1004'
アプリケーション定義またはオブジェクト定義のエラーです。

調査・検証内容としては以下の事を行いました。
  • コード中にもあるように、91→92に変更するとエラー
  • 数値以外の文字列を指定しても("abcdefghij"など)同じくエラー
  • obj(1 to 1,1 to 1)のように定義して、セルに代入すると大丈夫
どなたか、回避方法をご存知の方、
いらっしゃいましたら ご教授よろしくお願い致します。

環境:Windows XP(SP2)+Excel 2003(SP2)
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-01 19:28
引用:

電波くんさんの書き込み (2006-02-01 18:59) より:

配列中の文字列がある一定の文字数(バイト数?)を超えると以下のエラーが発生してしまいます。


セルにはバイト数の制限があったと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
電波くん
会議室デビュー日: 2003/10/30
投稿数: 11
お住まい・勤務地: 東京都千代田区
投稿日時: 2006-02-01 21:30
はじめまして。早速の返答ありがとうございます。
ものすごく困っていたので、助かります。
引用:
じゃんぬねっとさんの書き込み (2006-02-01 19:28) より:
セルにはバイト数の制限があったと思います。

なるほど。セルにはバイト数の制限があるのですね。

しかし、どうも腑に落ちないことがあります。

まず、エラーが発生してしまう同じ文字列を使って、
  • 手動でセルに文字列を入力すると、エラーとならない
  • サンプルコードのエラーが発生するところで、
    コード:
    Range("a1:a2") = str

    とすると、同じバイト数にもかかわらずエラーとならない
  • 先ほども記載したとおり、obj(1 to 1,1 to 1)のように定義して、セルに代入するとエラーにならない
配列ということが問題なのでしょうか。

ご存知でしたら、よろしくお願い致します。

もし、配列ということが問題で、変数からの代入が可能なのであれば、ある一定のバイト数を超える文字列については、何かコレクションのようなものにセルの参照と値(文字列)を退避しておき、
配列の貼り付けが終わったら、コレクションをFETCHして文字列を一つずつ設定しようと思っています。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-01 21:52
引用:

電波くんさんの書き込み (2006-02-01 21:30) より:

配列ということが問題なのでしょうか。


Range というところが問題なのです。
Cells だと成功するでしょう?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
電波くん
会議室デビュー日: 2003/10/30
投稿数: 11
お住まい・勤務地: 東京都千代田区
投稿日時: 2006-02-01 22:24
返答ありがとうございます。
何度もすいません。
引用:
じゃんぬねっとさんの書き込み (2006-02-01 21:52) より:
Range というところが問題なのです。
Cells だと成功するでしょう?

コード:
Range("a1:a2") = obj

この部分を、
コード:
Cells(1, 1) = obj

とするということなのでしょうか。

実行すると、"hoge"はセルA1に設定されるのですが、A2に文字列が表示されません。

そもそも、じゃんぬねっとさんがおっしゃる「Cells だと成功するでしょう」の私の解釈が違うのでしょうか。

本当に何度もすいませんが、よろしくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-02 00:02
引用:

電波くんさんの書き込み (2006-02-01 22:24) より:

「Cells だと成功するでしょう」の私の解釈が違うのでしょうか。


これでお試しください。

コード:

    Cells(1, 1) = "'hoge"
    Cells(2, 1) = str



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
電波くん
会議室デビュー日: 2003/10/30
投稿数: 11
お住まい・勤務地: 東京都千代田区
投稿日時: 2006-02-02 00:44
返答ありがとうございます。
引用:

じゃんぬねっとさんの書き込み (2006-02-02 00:02) より:
引用:

電波くんさんの書き込み (2006-02-01 22:24) より:

「Cells だと成功するでしょう」の私の解釈が違うのでしょうか。


これでお試しください。

コード:
Cells(1, 1) = "'hoge"
Cells(2, 1) = str



こちらのコードで、確かに文字列(str)をセルに設定することは出来ました。

しかし、これであれば、私が試した
コード:
Range("a1:a2") = str

つまり、
コード:
Range("a2") = str

でも出来ていて、
私の当初の目的である 配列を一度にセルへ貼り付けるということではありません。

じゃんぬねっとさんがおっしゃる「Cells だと成功するでしょう」ということにどうつながるのかがわかりませんでした。

結局、今回のような文字列サイズの大きなデータは、配列を使って一度にセルへ貼り付けられない(設定することが出来ない)ということなのでしょうか。

本当に何度もすいません
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-02 00:51
引用:

電波くんさんの書き込み (2006-02-02 00:44) より:

じゃんぬねっとさんがおっしゃる「Cells だと成功するでしょう」ということにどうつながるのかがわかりませんでした。


単一セル相手に Range を使う必要はないという意味でした。
"配列を使うことが" ではなく、配列 Range を組み合わせることが、でしたね。

引用:

結局、今回のような文字列サイズの大きなデータは、
配列を使って一度にセルへ貼り付けられない(設定することが出来ない)ということなのでしょうか。


そうです。
以前、COM から Range を扱った際に同じことで悩みました。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)