teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2021/02/10 13:51

投稿

jinoji
jinoji

スコア4592

answer CHANGED
@@ -1,2 +1,35 @@
1
1
  まず、やりたいことの確認ですが、
2
- 「A列~W列をループし、1行目のセルが空白の時、その"列幅"を、24列右の列(コピー先であるY列~AU列の該当列)に適用する」ということだと推測しましたが合ってますか?
2
+ 「A列~W列をループし、1行目のセルが空白の時、その"列幅"を、24列右の列(コピー先であるY列~AU列の該当列)に適用する」ということだと推測しましたが合ってますか?
3
+ もしそうだとしたら、
4
+ ```VBA
5
+ For i = 1 To 23
6
+ If Cells(1, i) = "" Then
7
+ Columns(i).Copy
8
+ Columns(i + 24).PasteSpecial xlPasteColumnWidths
9
+ End If
10
+ Next
11
+ ```
12
+ もしくは
13
+ ```VBA
14
+ For i = 1 To 23
15
+ If Cells(1, i) = "" Then
16
+ Columns(i + 24).ColumnWidth = Columns(i).ColumnWidth
17
+ End If
18
+ Next
19
+ ```
20
+
21
+ 私が前の質問のコメントで書いた、
22
+ ```VBA
23
+ c.EntireColumn.Copy
24
+ c.EntireColumn.Offset(, c.Columns.Count).PasteSpecial xlPasteColumnWidths
25
+ ```
26
+ は、実際的には「A列~W列の列幅を(ループで1列ずつではなく、一括で)X列~AV列に反映させる」という意味になります。
27
+ なので、Forループの中で使うのは意味がない(無駄)です。
28
+
29
+ なお、 For が作動しないのは、
30
+ For i = 1 To Cells(1, Columns.Count).End(xlToRight).Column**s** の最後の**s**が直接的な原因です。
31
+ 列番号を取得するところなので **Column**となるのが正解。あと、Endの向きも逆です。
32
+
33
+ For i = 1 To Cells(1, Columns.Count).End(**xlToLeft**).**Column**
34
+ ただし、このままだと、W列ではなくAU列が取れてしまうと思います。(右側にコピーした後なので。)
35
+ まず列幅を調整するForループを回した後で、コピー処理を動かす、という順番なら大丈夫だと思います。