
MS Officeのエクセル2000です。
下記Sub test01はRange("A1:I1")に文字列を入力し、一旦配列に取り込んでからワークシートに貼り付けるものです。
試験用のコードですので意味はありません。
このコードで255文字まではまったく問題はありません。
ところが、256文字以上の場合、横に貼り付けは問題ないのですが、 Transposeで縦に変換すると型が一致しません。(Error 13)となります。
どうしてでしょうか?
試行錯誤の結果、Sub test02のように一旦横に貼ったデータをコピーしてTransposeして貼り付けるのは大丈夫のようですので不思議でしょがありません。
またこの方法は列数256より要素が多い配列には使えないので解決策にはなりません。
ご教示くださいませ。
Sub test01()
Dim myAr As Variant
Dim i As Integer, n As Integer
n = 256 '文字数
With ActiveSheet
.UsedRange.ClearContents
For i = 1 To 9
.Cells(1, i).Value = Application.Rept(Left(.Cells(1, i).Address(0, 0), 1), n)
Next
myAr = .Range("A1:I1").Value
.Range("A3").Resize(, UBound(myAr, 2)).Value = myAr
.Range("A5").Resize(UBound(myAr, 2)).Value = Application.Transpose(myAr) '256文字の場合エラー
End With
End Sub
Sub test02()
Dim myAr As Variant
Dim i As Integer, n As Integer
n = 256 '文字数
With ActiveSheet
.UsedRange.ClearContents
For i = 1 To 9
.Cells(1, i).Value = Application.Rept(Left(.Cells(1, i).Address(0, 0), 1), n)
Next
myAr = .Range("A1:I1").Value
.Range("A3").Resize(, UBound(myAr, 2)).Value = myAr
.Range("A3").Resize(, UBound(myAr, 2)).Copy
.Range("A5").PasteSpecial Paste:=xlValues, Transpose:=True '256文字の場合もOK
Application.CutCopyMode = False
End With
End Sub
No.2ベストアンサー
- 回答日時:
VBAでワークシート関数を使う時、《引数に配列を渡す》場合、要素の文字数及び要素数に制限があります。
『オートメーションを使用して ADO レコードセットのデータを Excel に転送する方法』
http://support.microsoft.com/kb/246335/ja
このkbに簡単に触れてあります。
<引用ここから>
Excel の Transpose 関数を使用して配列を入れ替える場合は、Transpose 関数の次の制限に注意してください。
* 配列に 255 文字を超える要素を含めることはできません。
* 配列に Null 値を含めることはできません。
* 配列内の要素数が 5461 を超えることはできません。
<引用ここまで>
▽ここも参照しておいたほうが良いかもしれません。
『オートメーションを使用して Excel に配列を渡すことの XL の制限事項』
http://support.microsoft.com/kb/177991/ja
また、Transposeに限らず、他のワークシート関数でも該当します。
Sub test()
Const n1 As Long = 256
Const n2 As Long = 5462
Dim v, w, x, y
v = Array("a", String(n1, "a"))
ReDim w(1 To n2)
On Error GoTo errHndr
With Application
1: x = .CountA(v)
2: x = .Transpose(v)
3: x = .Index(v, 1)
4: y = .CountA(w)
5: y = .Transpose(w)
6: y = .Index(w, 1)
End With
Erase w
Exit Sub
errHndr:
MsgBox "Line " & Erl & vbLf & Err.Number & " : " & Err.Description
Resume Next
End Sub
>Sub test02のように一旦横に貼ったデータをコピーしてTransposeして貼り付けるのは大丈夫のようですので不思議でしょがありません。
test02はワークシートTranspose関数ではなく、PasteSpecialメソッドですから、比較にはなりません。
解決策としては、Loop処理で自前で入れ替えてあげれば良いかと。
配列処理なので速度的には大差ないと思います。
>.Range("A5").Resize(UBound(myAr, 2)).Value = Application.Transpose(myAr) '256文字の場合エラー
.Range("A5").Resize(UBound(myAr, 2)).Value = vTrans(myAr)
':
Private Function vTrans(v As Variant) As Variant
Dim L1 As Long, U1 As Long
Dim L2 As Long, U2 As Long
Dim rn As Long, cn As Long
Dim i As Long, j As Long
L1 = LBound(v, 1)
U1 = UBound(v, 1)
L2 = LBound(v, 2)
U2 = UBound(v, 2)
cn = 0
ReDim x(1 To U2 - L2 + 1, 1 To U1 - L1 + 1)
For i = L1 To U1
cn = cn + 1
rn = 0
For j = L2 To U2
rn = rn + 1
x(rn, cn) = v(i, j)
Next j
Next i
vTrans = x
End Function
#余談ですが、2003からは要素数5,461の制限は65,536に改善されています。
#要素数というより、次元あたりの要素数のようですが。
> Excel の Transpose 関数を使用して配列を入れ替える場合は、Transpose 関数の次の制限に注意してください。
存じませんでした。
ありがとうございます。勉強になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【VBA】配列とWorksheetFunction.Transpose
Visual Basic(VBA)
-
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
ExcelのVBA。public変数の値が消える
Visual Basic(VBA)
-
-
4
HTMLからフォルダを開きたい
HTML・CSS
-
5
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
6
array関数で格納した配列の型を変更する
Visual Basic(VBA)
-
7
vba フィルター 複数条件 3つ以上 完全一致除外
Visual Basic(VBA)
-
8
Accessのマクロでモジュールを実行させたい。
Access(アクセス)
-
9
Accessのテーブルを既存のExcelファイルへエクスポートしたいんですが
Access(アクセス)
-
10
Excelでセル参照したとき、書式も一緒に持ってくるには?
Windows Vista・XP
-
11
VBA:日付を配列に入れ別セルに転記するとデータ型が変わる
Visual Basic(VBA)
-
12
動的配列が存在(要素が有る)か否かを判定できますか?
Visual Basic(VBA)
-
13
ExcelVBA でリストリストボックスに列見出しをコーディングでつける
Excel(エクセル)
-
14
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
15
【Excel VBA】マクロでExcel自体を終了させたい
Excel(エクセル)
-
16
Excelのシート上のShapeにイベントは設定できる?
Excel(エクセル)
-
17
ウォッチ式の文字数制限について
Visual Basic(VBA)
-
18
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
19
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
20
VBAマクロ実行時エラーの修正について
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミング アルゴリズム
-
VBA 二次元配列 ループの書き方
-
VBA 二次元配列の1つ目を増...
-
VBA 条件
-
VBA 多次元配列を用いてグルー...
-
エクセルVBAでTransposeの不思議
-
基本情報技術者での質問です。
-
perlで2次元配列をサブルーチ...
-
リストボックスに縦スクロール...
-
perl このテキストファイルを簡...
-
フローチャートを教えてください
-
配列の問題
-
jcode->jfold で禁則処理
-
Strawberry Perl for Windows ...
-
VBA ニュースタイトル取得
-
どなたかこのプログラミングを...
-
プログラムはif文とforループが...
-
python質問
-
``` #include <stdio.h> #inclu...
-
imacros 内でのループ処理
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのautofilter、criteriaの配...
-
マクロ Publicでの配列定義
-
エクセルVBAでTransposeの不思議
-
二次元配列のインデックスについて
-
クラスに配列を渡す方法
-
2次元配列or複数回のファイル読...
-
チェックボックスのperlでの値...
-
Excel VBA ユーザーフォームの...
-
リストボックスに縦スクロール...
-
perlで2次元配列をサブルーチ...
-
Dim flag(4) as boolean で配列...
-
文字の整列(printf)
-
VBA 二次元配列の1つ目を増...
-
二次元配列における要素数のは...
-
DataGridViewに配列の値を表示...
-
可変長配列を、動的確保した固...
-
アクセス拒否
-
VB6で配列の最大値を簡単に求め...
-
文字列の分割について
-
perl このテキストファイルを簡...
おすすめ情報