回答編集履歴

1

追記

2021/02/10 13:51

投稿

jinoji
jinoji

スコア4592

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