我有一個包含3300個名稱和地址的列表。唯一的名字只有300.爲了對它們進行地理編碼,我搜索了唯一的地址,獲得每個地址的座標。不同列表中的相關值
現在我有兩個MS excel表單中的這兩個列表,並且我想將每個名稱與他的地址的座標關聯起來。
我有一個包含3300個名稱和地址的列表。唯一的名字只有300.爲了對它們進行地理編碼,我搜索了唯一的地址,獲得每個地址的座標。不同列表中的相關值
現在我有兩個MS excel表單中的這兩個列表,並且我想將每個名稱與他的地址的座標關聯起來。
我建議加入Latitude
和Longitude
列到你的藍表,而不是創建綠色之一。
使用下列公式:
=INDEX(Latitude_orange_column, MATCH(address1_blue_cell, Address_orange_column, 0))
=INDEX(Longitude_orange_column, MATCH(address1_blue_cell, Address_orange_column, 0))
這是VBA版本,它允許您靈活地(1)自定義您的工作表名稱和您的起始數據位置(S)和(2)把你的'結果'放入任何起始單元格位置的任何表單中。
本質上,代碼將數據放入數組中,處理數據並將結果放入第三個數組中。然後可以很容易地將這個「結果」數組傳送到指定工作表上的指定範圍。
注意:請在您的數據副本上運行該代碼,因爲它會刪除姓名數據中的重複項。
Option Explicit
Sub AssocLocs()
Dim wsName As Worksheet, wsLocn As Worksheet, wsRes As Worksheet
Dim nmeRng As Range, locnRng As Range
Dim nmeStRow As Long, nmeEndRow As Long, nmeCol As Long
Dim locnStRow As Long, locnEndRow As Long, locnCol As Long
Dim resStRow As Long, resCol As Long
Dim N As Long, L As Long, e As Long
Dim nmeArr(), locnArr(), resArr()
'Setup======================================
'worksheets
Set wsName = Sheets("Sheet1") 'name data
Set wsLocn = Sheets("Sheet2") 'location data
Set wsRes = Sheets("Sheet1") 'results
'original data (x2) cell start positions
nmeStRow = 2 'header row
nmeCol = 2
locnStRow = 2 'header row
locnCol = 2
'result destination cell start position
resStRow = 2
resCol = 6
'===========================================
'unique name data into array
With wsName
nmeEndRow = .Cells(Rows.Count, nmeCol).End(xlUp).Row
Set nmeRng = .Range(.Cells(nmeStRow + 1, nmeCol), .Cells(nmeEndRow, nmeCol + 1))
nmeRng.Sort Key1:=.Range("B3"), Order1:=xlAscending, Header:=xlYes
nmeRng.RemoveDuplicates Columns:=1 ', Header:=xlYes
nmeEndRow = .Cells(Rows.Count, nmeCol).End(xlUp).Row
Set nmeRng = .Range(.Cells(nmeStRow + 1, nmeCol), .Cells(nmeEndRow, nmeCol + 1))
nmeArr() = nmeRng.Value
End With
'sorted location data into array
With wsLocn
locnEndRow = .Cells(Rows.Count, locnCol).End(xlUp).Row
Set locnRng = .Range(.Cells(locnStRow, locnCol), .Cells(locnEndRow, locnCol + 2))
locnRng.Sort Key1:=.Range("B3"), Order1:=xlAscending, Header:=xlYes
locnArr() = locnRng.Value
End With
e = -1
For N = LBound(nmeArr()) To UBound(nmeArr())
For L = LBound(locnArr()) To UBound(locnArr())
If nmeArr(N, 2) = locnArr(L, 1) Then
e = e + 1
ReDim Preserve resArr(4, e)
resArr(0, e) = nmeArr(N, 1)
resArr(1, e) = nmeArr(N, 2)
resArr(2, e) = locnArr(L, 2)
resArr(3, e) = locnArr(L, 3)
Exit For
End If
Next L
Next N
With wsRes
.Range(.Cells(resStRow, resCol), .Cells(resStRow + UBound(resArr, 2), resCol + 4)) = Application.Transpose(resArr)
End With
End Sub
最後,this article相當其維護了使用循環遍歷數組一個良好的閱讀。
謝謝你的建議,barryleajio。順便說一句,我發現Aprillion的方法更適合我的問題。 – 2015-02-08 23:20:53
這太好了 - 很高興你能排序,並感謝你的禮貌和反饋。 – barryleajo 2015-02-09 07:11:43
哇!它完美的工作!非常感謝! – 2015-02-08 23:15:29