回答編集履歴
7
コード修正
answer
CHANGED
@@ -58,11 +58,9 @@
|
|
58
58
|
Set rng1 = ws1.Range(rng1.Offset(0, 3), rng1.End(xlToRight)) 'コピー元範囲
|
59
59
|
Set rng2 = ws2.Range("A1").Resize(rng1.Rows.Count, rng1.Columns.Count) 'コピー先範囲
|
60
60
|
|
61
|
-
'値のみコピー
|
61
|
+
'値のみコピーの場合、下記の代入操作が、
|
62
|
-
rng1.Copy rng2, Paste:=xlPasteValues
|
63
|
-
|
64
|
-
'
|
62
|
+
'高速かつクリップポードを使わずにコピーできるのでお勧め
|
65
|
-
|
63
|
+
rng2.Value = rng1.Value
|
66
64
|
|
67
65
|
End If
|
68
66
|
|
6
コード修正
answer
CHANGED
File without changes
|
5
コード修正
answer
CHANGED
@@ -55,7 +55,7 @@
|
|
55
55
|
If rng1 Is Nothing Then
|
56
56
|
MsgBox "none"
|
57
57
|
Else
|
58
|
-
Set rng1 = ws1.Range(rng1.Offset(0,
|
58
|
+
Set rng1 = ws1.Range(rng1.Offset(0, 3), rng1.End(xlToRight)) 'コピー元範囲
|
59
59
|
Set rng2 = ws2.Range("A1").Resize(rng1.Rows.Count, rng1.Columns.Count) 'コピー先範囲
|
60
60
|
|
61
61
|
'値のみコピー
|
4
間違い修正
answer
CHANGED
@@ -50,7 +50,7 @@
|
|
50
50
|
Set wb2 = Workbooks.Open("C:\Users~~~") '転記先ファイル
|
51
51
|
Set ws2 = wb2.Worksheets(1)
|
52
52
|
|
53
|
-
Set rng1 = ws1.Range("A:A").Find("
|
53
|
+
Set rng1 = ws1.Range("A:A").Find("111111115") '該当データ検索
|
54
54
|
|
55
55
|
If rng1 Is Nothing Then
|
56
56
|
MsgBox "none"
|
3
説明追加
answer
CHANGED
@@ -71,4 +71,5 @@
|
|
71
71
|
|
72
72
|
- Option Explicit は宣言しておく。変数のスペルミスやバグの発生の抑制になる。
|
73
73
|
- 各オブジェクトを変数に代入して利用すると見通しのよいコードになる。
|
74
|
-
- 値のみのコピーなら代入処理がシンプルかつ高速。
|
74
|
+
- 値のみのコピーなら代入処理がシンプルかつ高速。
|
75
|
+
- 不要な Select はしない。
|
2
サンプルコードの追加
answer
CHANGED
@@ -26,4 +26,49 @@
|
|
26
26
|
|
27
27
|
[Office TANAKA \- Excel VBA講座:セルの操作[セルのコピー]](http://officetanaka.net/excel/vba/cell/cell09.htm)
|
28
28
|
|
29
|
-
このようなことを繰り返すことで確実にスキルアップできます。
|
29
|
+
このようなことを繰り返すことで確実にスキルアップできます。
|
30
|
+
|
31
|
+
私ならこうする
|
32
|
+
---
|
33
|
+
できれば、自身で考えてもらえればスキルアップになるかと、あえてリンク先だけの紹介に止めましたが、せっかくなので、コード例を提示しておきます。
|
34
|
+
|
35
|
+
```vba
|
36
|
+
Option Explicit '変数宣言強制
|
37
|
+
|
38
|
+
Sub Test()
|
39
|
+
Dim wb1 As Workbook
|
40
|
+
Dim wb2 As Workbook
|
41
|
+
Dim ws1 As Worksheet
|
42
|
+
Dim ws2 As Worksheet
|
43
|
+
Dim rng1 As Range
|
44
|
+
Dim rng2 As Range
|
45
|
+
|
46
|
+
|
47
|
+
Set wb1 = Workbooks.Open("C:\Users~~~") '転記元ファイル
|
48
|
+
Set ws1 = wb1.Worksheets(1)
|
49
|
+
|
50
|
+
Set wb2 = Workbooks.Open("C:\Users~~~") '転記先ファイル
|
51
|
+
Set ws2 = wb2.Worksheets(1)
|
52
|
+
|
53
|
+
Set rng1 = ws1.Range("A:A").Find("1111") '該当データ検索
|
54
|
+
|
55
|
+
If rng1 Is Nothing Then
|
56
|
+
MsgBox "none"
|
57
|
+
Else
|
58
|
+
Set rng1 = ws1.Range(rng1.Offset(0, 2), rng1.End(xlToRight)) 'コピー元範囲
|
59
|
+
Set rng2 = ws2.Range("A1").Resize(rng1.Rows.Count, rng1.Columns.Count) 'コピー先範囲
|
60
|
+
|
61
|
+
'値のみコピー
|
62
|
+
rng1.Copy rng2, Paste:=xlPasteValues
|
63
|
+
|
64
|
+
'下記のの方が高速かつクリップポードを使わずにコピーできるのでお勧め
|
65
|
+
'rng2.Value = rng1.Value
|
66
|
+
|
67
|
+
End If
|
68
|
+
|
69
|
+
End Sub
|
70
|
+
```
|
71
|
+
|
72
|
+
- Option Explicit は宣言しておく。変数のスペルミスやバグの発生の抑制になる。
|
73
|
+
- 各オブジェクトを変数に代入して利用すると見通しのよいコードになる。
|
74
|
+
- 値のみのコピーなら代入処理がシンプルかつ高速。
|
1
誤字の修正
answer
CHANGED
@@ -19,7 +19,7 @@
|
|
19
19
|
このように「マクロの記録」を使えば、手作業でできることはたいていマクロにできます。
|
20
20
|
できたマクロのコードの意味をヘルプ等で調べれば、そのうち「マクロの記録」に頼らなくてもコードが書けるようになります。
|
21
21
|
|
22
|
-
ただし、「マクロの記録」は手作業をコードに変換しただけなので、効率的でコードになることが多いです。
|
22
|
+
ただし、「マクロの記録」は手作業をコードに変換しただけなので、効率的でない冗長なコードになることが多いです。
|
23
23
|
例えば、今回の場合、手作業だと、範囲選択してコピー、目的のセル範囲に移動して貼り付け、という処理になりますので、「マクロの記録」でできあがるコードは数行のものになります。 ところが、VBAなら、Copyメソッド1行で同じことができます。 あるいは、代入という操作でも1行でできます。
|
24
24
|
|
25
25
|
下記のリンク先を参考に、「マクロの記録」のコードを書き換えることもチャレンジしてみてください。
|