Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4615 / 13644 ツリー ←次へ | 前へ→

【55592】行列変換について KEI 08/5/12(月) 19:02 質問[未読]
【55593】Re:行列変換について りん 08/5/13(火) 4:43 回答[未読]
【55594】Re:行列変換について テト 08/5/13(火) 11:20 回答[未読]

【55592】行列変換について
質問  KEI  - 08/5/12(月) 19:02 -

引用なし
パスワード
   縦3列に並んだデータを、行列変換して、違うシートに一列に任意の空白を空けて、並べたいと考えています。
ABC 
ABC  ⇒ AAAA(任意の空白)BBBB(任意の空白)CCCC  
ABC
ABC
今まではシートの中にある一列のデータを全て選択して、行列変換して貼り付けていたので、以下のコードで問題ありませんでした。
  Sheets("シート1").Select
  Range("A1").Select
  Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
  Selection.Copy
  Sheets("シート2").Select
  Range("A1").Select
  Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone,  
  SkipBlanks:=False, Transpose:=True
今回、不特定の個数の1列に並んだデータが3列あるので、これを1列ずつ行列変換して、上の図のように、並べたいと考えています。
そこで、以下のようなコードを実行したら、
  Sheets("シート1").Select
  Range("A1").Select
  ROW("A").Select
  Selection.Copy
  Sheets("シート2").Select
  Range("A1").Select
”コピー領域と貼り付け領域が違う”というエラーが出て実効できません。
もしご存知の方がいれば、プログラムの書き方をご教授お願いできないでしょうか?
  Selection.PasteSpecial Paste:=xlAll, Operation

【55593】Re:行列変換について
回答  りん E-MAIL  - 08/5/13(火) 4:43 -

引用なし
パスワード
   KEI さん、おはようございます。

>縦3列に並んだデータを、行列変換して、違うシートに一列に任意の空白を空けて、並べたいと考えています。
>ABC 
>ABC  ⇒ AAAA(任意の空白)BBBB(任意の空白)CCCC  
>ABC
>ABC
>今まではシートの中にある一列のデータを全て選択して、行列変換して貼り付けていたので、以下のコードで問題ありませんでした。

ROW("A")もエラーになりそうなものですが。

列全体選択時の行数 > シート上の列数
  XP:  65536行 >  256列
  2007:1048576行 > 16384列

なので列全体でコピーして回転すると範囲外にも貼り付けることになるので”コピー領域と貼り付け領域の形が違う”エラーになります

Sub test()
  Dim ws(1 To 2) As Worksheet, r1 As Range
  Dim CC As Long, Cpos As Long, Rpos As Long, NN As Long
  '対象はこのブック
  With ThisWorkbook
   Set ws(1) = .Worksheets("Sheet1") 'コピー元
   Set ws(2) = .Worksheets("Sheet2") 'コピー先
  End With
  '念のためクリア
  ws(2).Cells.ClearContents
  '貼り付け先情報
  Rpos = 1 '貼り付け先行番号
  Cpos = 1 '最初の貼り付け先列番号
  NN = 2 '任意の空白
  '開始
  For CC = 1 To 3
   'コピー元シートの処理
   'データの入っている範囲をセット
   With ws(1)
     Set r1 = .Range(.Cells(1, CC), .Cells(.Rows.Count, CC).End(xlUp))
   End With
   'ペースト先シートの処理
   With ws(2)
     If Cpos + r1.Count > .Columns.Count Then
      MsgBox vbCrLf & Cpos + r1.Count & " > " & ws(2).Columns.Count, _
          vbExclamation, "Error" '列数オーバーで中断
     Else
      'コピペ
      r1.Copy
      .Cells(Rpos, Cpos).PasteSpecial Transpose:=True
      Application.CutCopyMode = False
      '次の貼り付け先
      Cpos = Cpos + r1.Count + NN
     End If
   End With
  Next
  '終了
  Set r1 = Nothing
  Erase ws
End Sub

こんな感じです。

【55594】Re:行列変換について
回答  テト  - 08/5/13(火) 11:20 -

引用なし
パスワード
   別案。

――――――――――――――――――――――――――――――
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim i As Long
Dim j As Long
Dim k As Long
Dim inSpc As Long

'任意の空白数
inSpc = 1

Set ws1 = ActiveWorkbook.Worksheets("シート1")
Set ws2 = ActiveWorkbook.Worksheets("シート2")

For i = 1 To 3
  k = 1
  For j = 1 To ws1.Cells(ws1.Rows.Count, i).End(xlUp).Row
    '最大列数超過
    If k > ws2.Columns.Count Then
      Exit Sub
    '上記以外
    Else
      ws2.Cells(i, k).Value = ws1.Cells(j, i).Value
      k = k + 1 + inSpc
    End If
  Next j
Next i
――――――――――――――――――――――――――――――

4615 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free