- PR -

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

投稿者投稿内容
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2006-02-02 01:04
[XL2003] 長い文字列配列を代入すると "実行時エラー 1004" が発生する

ということです。

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



あんまりいい説明ではないような・・・

Range Property と Cells Property の違いについて・・・
ともに Excel.Range Object を返すのは共通ですが、
Range が引数をとるのにたいし、Cells には引数がありません。

つまり Cells は Worksheet のすべての Range Collection Object を返すわけです。

まあ、Cells(1, 1) とか書くのが一般的なんでそう書いたとおもいますが、
正確には Cells(1, 1) は、Cells._Default(1, 1) すなわち
Cells.Item(1, 1) の省略形ということです。

この場合、そんな長いのは配列では扱えません。
[編集] そんな長いのは配列では代入できません。
というのが正しい解答でしょう。

[編集]"."が、"。"になっていたのを訂正

[ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2006-02-02 01:06

[ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2006-02-02 01:07 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-02 01:18
引用:

ちゃっぴさんの書き込み (2006-02-02 01:04) より:

あんまりいい説明ではないような・・・


すいません、すいません。(*_ _)

引用:

まあ、Cells(1, 1) とか書くのが一般的なんでそう書いたとおもいますが、
この場合、そんな長いのは配列では扱えません。
[編集] そんな長いのは配列では代入できません。
というのが正しい解答でしょう。


先にも書きましたが、明らかにまずい回答でした。
フォローさせちゃって申し訳ないです。

# しかも先のレスも眠いせいか日本語がおかしい... orz
# 先ほどからコクコクしてますし、素直に寝るとします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
電波くん
会議室デビュー日: 2003/10/30
投稿数: 11
お住まい・勤務地: 東京都千代田区
投稿日時: 2006-02-02 12:10
はじめまして。ちゃっぴさん
引用:
ちゃっぴさんの書き込み (2006-02-02 01:04) より:
[XL2003] 長い文字列配列を代入すると "実行時エラー 1004" が発生する

この場合、そんな長いのは配列では扱えません。

マイクロソフトのサイトに載っていたのですね。
すいません+情報ありがとうございます。

実は、Excel(VBA)でCSVデータの取り込み処理を行っているのですが、今回のような大きさの
文字列がCSV出力され、エラーが発生してしまい困っていました。

 長い文字列配列をセルに代入することは出来ない

このことがわかりましたので、+CSV中に長い文字列の出現頻度が稀なため、前の投稿でも書た通り
CSV取り込み時、長い文字列が存在すれば、コレクションなどに一時退避しておき、
配列を貼り付け(代入)後、別途長い文字列を設定(代入)したいと思います。

以下、処理イメージです。

クラスモジュール:Class1には、
コード:
Public adr As String
Public str As String

これらが定義されているものとします。

以下は、(コマンドボタンクリックなどの)イベント処理です。
コード:
'仮想CSVデータ(2項目目と5項目目が長い文字列)
Dim csvStr As String
csvStr = "hoge," & String$(912, 97) & ",foo,bar," & String$(912, 98)

'CSVデータ一括取り込み用配列
Dim items As Variant
Dim i As Long
items = Split(csvStr, ",")
ReDim obj(0 To 0, 0 To UBound(items)) As Variant

'912文字以上の文字列を退避する
Dim OverObjs As New Collection
Dim OverObj As Class1

For i = LBound(items) To UBound(items)
If Len(items(i)) > 911 Then
    '範囲を超える文字列は退避
    obj(0, i) = ""
    Set OverObj = New Class1
    OverObj.adr = Cells(1, i + 1).Address
    OverObj.str = items(i)
    OverObjs.Add OverObj, OverObj.adr
Else
    '範囲内の文字列は配列に格納
    obj(0, i) = items(i)
End If
Next i

'文字列配列を代入
Range("a1").Resize(1, 4).Value = obj

'912文字以上の文字列を別途代入する
For Each OverObj In OverObjs
Range(OverObj.adr) = OverObj.str
Next OverObj

ちゃっぴさん、
私にとって大変有意義な情報、本当にありがとうございました。

引用:
じゃんぬねっとさんの書き込み (2006-02-02 01:18) より:
# しかも先のレスも眠いせいか日本語がおかしい... orz
# 先ほどからコクコクしてますし、素直に寝るとします。

夜分遅くまでお付き合いいただき、本当にありがとうございました。

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