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

回答編集履歴

2

書式の改善

2018/11/03 05:20

投稿

mattuwan
mattuwan

スコア2167

answer CHANGED
@@ -59,6 +59,7 @@
59
59
 
60
60
  時間が出来たので、コードを追記しておきます。
61
61
 
62
+ ```VBA
62
63
  '関数入力案
63
64
  Sub test1()
64
65
  Dim rngTable As Range '更新対象の表
@@ -107,6 +108,7 @@
107
108
  rngTable.Columns(2).Replace r.Cells(2).Value, r.Cells(1).Value
108
109
  Next
109
110
  End Sub
111
+ ```
110
112
 
111
113
  Vlookup関数の話があったのでそちらに引きずられましたが、
112
114
  単に置換の話なので置換機能を使った方がコードが簡便ですね。

1

誤字の修正&コードの追記

2018/11/03 05:20

投稿

mattuwan
mattuwan

スコア2167

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  > Excelだと、VLOOKUP関数を用いてできる、とのことですが
2
2
 
3
3
  Index関数とMatch関数の組み合わせの間違いでは?
4
- VLook関数だと2列目索引に出来ないので、
4
+ VLookup関数だと2列目索引に出来ないので、
5
5
  他のアプローチが必要かと思います。
6
6
 
7
7
  > どのようにすればできるか、ヒントがあれば教えてください。
@@ -15,9 +15,9 @@
15
15
  (他のアプローチももちろんあります。)
16
16
  この操作を自動で行うよう、マクロを考えたらいいと思います。
17
17
 
18
- 変に、「プログラミングをするんだ」と、肩を張らず、
18
+ 変に、「プログラミングをするんだ」と、肩を張らず、
19
19
  エクセル君に任せられるところは任せて、
20
- 自分は手順だけを指示してやるように考えてみてはいかがでしょうか?
20
+ 自分は作業の手順だけを指示してやるように考えてみてはいかがでしょうか?
21
21
 
22
22
  流れとしては、
23
23
 
@@ -55,4 +55,64 @@
55
55
  動作確認ができますし、
56
56
  いろいろな案も出てくるでしょう。また、それを実際に動かして比べられますし、
57
57
  高速化などの話もいろいろ話が出来るかなとは思いますが、
58
- そこまでは望んでないのでしょうかね。
58
+ そこまでは望んでないのでしょうかね。
59
+
60
+ 時間が出来たので、コードを追記しておきます。
61
+
62
+ '関数入力案
63
+ Sub test1()
64
+ Dim rngTable As Range '更新対象の表
65
+ Dim rngKey As Range '検索の索引になるセル範囲
66
+ Dim rngTemp As Range '数式を一時的に入れるセル範囲
67
+ Dim rngList As Range '変更の元となる一覧表
68
+ Dim strFormula As String '数式とする文字列
69
+
70
+ 'セル範囲特定
71
+ With Sheets("学科").Range("A1").CurrentRegion
72
+ Set rngTable = .Cells
73
+ Set rngKey = Intersect(.Offset(1), .Columns(2))
74
+ Set rngTemp = Intersect(.Offset(1).EntireRow, .Columns(.Columns.Count + 1))
75
+ End With
76
+ With Sheets("学部").Range("A1").CurrentRegion
77
+ Set rngList = Intersect(.Cells, .Offset(1))
78
+ End With
79
+
80
+ '1行目の数式の作成(2行目以降はエクセル君に任せる)
81
+ strFormula = "=INDEX(" & rngList.Address(, , , True) & ",MATCH(" & _
82
+ rngKey(1).Address(False, False, , external:=True) & "," & _
83
+ rngList.Columns(2).Address(, , , True) _
84
+ & ",0),1)"
85
+
86
+ '数式の入力
87
+ rngTemp.Formula = strFormula
88
+ '値のみ転記
89
+ rngTemp.Copy
90
+ rngKey.PasteSpecial xlPasteValues
91
+ '作業列のクリア
92
+ rngTemp.ClearContents
93
+ End Sub
94
+
95
+ '繰返し置き換える案
96
+ Sub test2()
97
+ Dim rngList As Range
98
+ Dim rngTable As Range
99
+ Dim r As Range
100
+
101
+ With Sheets("学部").Range("A1").CurrentRegion
102
+ Set rngList = Intersect(.Cells, .Offset(1))
103
+ End With
104
+ Set rngTable = Sheets("学科").Range("A1").CurrentRegion
105
+
106
+ For Each r In rngList.Rows
107
+ rngTable.Columns(2).Replace r.Cells(2).Value, r.Cells(1).Value
108
+ Next
109
+ End Sub
110
+
111
+ Vlookup関数の話があったのでそちらに引きずられましたが、
112
+ 単に置換の話なので置換機能を使った方がコードが簡便ですね。
113
+ (数式の場合は細かくセルを特定しなきゃいけないのと、
114
+ 数式を示す文字列を作るのが面倒)
115
+ 無かった時とかの例外処理も不要だったと思うけど、
116
+ 一応デバッグとかしてみてください。
117
+ 速度はどれが速いか興味深いですが、
118
+ そこまでテストする時間がないのでこの辺で^^;