Transpose メソッドを使わずに行列入れ替えて貼り付ける

## 行列入れ替えをTransposeを使用せずに行う方法

今回はあるブックから別ブックのシートへ貼り付けを行う際、行列を入れ替えて貼り付ける方法を考える。
Transposeメソッドはあえて使用せず、貼り付け元データを変数に格納してから行列入れ替えて貼り付けることにする。
実装するプログラムは1列→1行への入れ替えとする。

```VB
Sub CopyAndTransposeRowToColumn()
    Dim wb As Workbook
    Dim wsSource As Worksheet
    Dim wsDest As Worksheet
    Dim sourceFilePath As String
    Dim sourceRange As Range
    Dim dataArr As Variant
    Dim tempArr As Variant
    Dim maxColmns As Integer
    Dim i As Long
    
    ' コピー元のファイルパス
    sourceFilePath = "C:\Users\user\desktop\folder\sample.xlsx"
    
    ' 貼り付け先のワークシート
    Set wsDest = ThisWorkbook.Sheets("Sheet1")
    
    ' 画面更新オフ（処理を高速化）
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    
    ' 非表示でブックを開く（読み取り専用）
    Set wb = Workbooks.Open(sourceFilePath, ReadOnly:=True)
    Set wsSource = wb.Sheets("Sheet1") ' コピー元のシートを指定
    
    ' コピー元の範囲（1列のデータ）
    Set sourceRange = wsSource.Range("A1:J1")
    
    '　データを配列に格納
    detaArr = sourceRange.Value
    
    ' データの列数をカウントする
    maxColmns = UBound(detaArr, 2)
    
    ' 転置用の仮の配列を作成
    ReDim tempArr(1 To maxColmns, 1 To 1)
    
    ' 転置処理（1列→1行
    For i = 1 To maxColmns
        tempArr(i, 1) = detaArr(1, i)
    Next i
    
    ' 転置したデータを貼り付け（1行maxColmns列にする）
    wsDest.Range("A1").Resize(maxColmns, 1).Value = tempArr
    
    ' ブックを閉じる
    wb.Close SaveChanges:=False
    
    ' オブジェクト開放
    Set sourceRange = Nothing
    Set wsSource = Nothing
    Set wb = Nothing
    
    ' 画面更新オン
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    
End Sub
```
### コードの解説

#### 1：変数を作成。
``` vb
    Dim wb As Workbook
    Dim wsSource As Worksheet
    Dim wsDest As Worksheet
    Dim sourceFilePath As String
    Dim sourceRange As Range
    Dim dataArr As Variant
    Dim tempArr As Variant
    Dim maxColmns As Integer
    Dim i As Long
```

wb → コピー元の ブック（Workbook）
wsSource → コピー元の シート（Worksheet）
wsDest → 貼り付け先の シート
sourceFile → コピー元のファイルパス
sourceRange → コピーする範囲
dataArr → コピー元のデータを格納する配列
tempArr → 転置（行列入れ替え）したデータを格納する配列
maxColmns → データの列数
i → ループ処理用の変数


#### 2：コピー元のファイルパスを指定
```vb
sourceFilePath = "C:\Users\user\desktop\folder\sample.xlsx"
```
コピー元のExcelファイルのフルパスを指定

#### 3：貼り付け先のワークシートを指定
```vb
Set wsDest = ThisWorkbook.Sheets("Sheet1")
```
ThisWorkbook → このマクロが実行されるExcelブック
"Sheet1" → 貼り付けるシート名を指定

#### 4：画面更新をオフにして処理を高速化
```vb
Application.ScreenUpdating = False
Application.DisplayAlerts = False
```
ScreenUpdating = False → 画面の更新を止めることで処理を高速化
DisplayAlerts = False → 警告メッセージを非表示（例：上書き確認ダイアログを出さない）

#### 5：別のブックを開く
```vb
Set wb = Workbooks.Open(sourceFilePath, ReadOnly:=True)
Set wsSource = wb.Sheets("Sheet1") 
```
Workbooks.Open(sourceFile, ReadOnly:=True) →
　　指定したExcelファイルを開く（読み取り専用）
Set wsSource = wb.Sheets("Sheet1") →
　　コピー元のシートを指定

#### 6：コピーするデータの範囲を指定
```vb
Set sourceRange = wsSource.Range("A1:J1")
```
Range("A1:C10") → コピーするセル範囲を指定

#### 7：セルの値を配列に格納
```vb
detaArr = sourceRange.Value
```
sourceRange.Value を dataArr に代入
これにより、コピー元のデータを配列 dataArr に一括で格納

#### 8：データの列数を maxColmns に格納
```vb
maxColmns = UBound(detaArr, 2)
```
detaArrの列数を UBound()で計算し、maxColmnsに代入
 UBound()の二つ目の引数を1にすると行数、2にすると列数が数えられる

 #### 9：転置用の配列を作成
 ```vb
 ReDim tempArr(1 To maxColmns, 1 To 1)
 ```
ReDim tempArr(1 To 列数, 1 To 行数) →
　　転置後のサイズに合わせて tempArr を再定義（行と列を入れ替える）

#### 10：転置処理（行列を入れ替える）
```vb
For i = 1 To maxColmns
    tempArr(i, 1) = detaArr(1, i)
Next i
```
i（列）のデータを i（行）に移動

#### 11：転置したデータを貼り付け
```vb
wsDest.Range("A1").Resize(maxColmns, 1).Value = tempArr
```
Range("A1") から 転置したデータを貼り付け
Resize(行数, 列数) で転置後のデータのサイズに合わせて貼り付け

#### 12：コピー元のブックを閉じる
```vb
wb.Close SaveChanges:=False
```
SaveChanges:=False で 保存せずにブックを閉じる

#### 13：メモリ解放
```vb
Set sourceRange = Nothing
Set wsSource = Nothing
Set wb = Nothing
```
変数の参照を解除

#### 14：画面更新を再開
```vb
Application.ScreenUpdating = True
Application.DisplayAlerts = True
```

このコードは1行のデータのみ対応できますが、複数行のデータにも対応するコードが必要であれば作成してみてください