用于确定给定地理坐标位于哪个地理区域的宏

时间:2014-03-27 20:24:10

标签: excel vba excel-vba csv

我在地理上有不同的区域,其边界由CSV文件中的地理坐标集(area1.csv,area2.csv,area3.csv,.....)给出。 CSV文件中的地理坐标是逗号分隔的纬度/经度对。在Excel工作表中,我在'工作表1和#39;的A和B列中有其他一组纬度/经度坐标。现在,我想要一个宏来确定每个纬度/经度对的位置,并将结果写入excel中的另一个工作表,例如“工作表2'”,第三列中每个条目的区域或写入结果为CSV文件。

例如,假设我们定义如下矩形区域:

Area1.csv:
纬度,经度
0,0
2,0
0,2
2,2
0,0

Area2.csv:
纬度,经度
2,0
4,0
4,2
2,2
2,0

Area3.csv:
纬度,经度
0,2
2,2
2,4
0,4
0,2

Area4.csv:
纬度,经度
2,2
4,2
4,4
2,4
2,2

我们想要找到我们在excel'表1'中所拥有的以下坐标对。在列' A'和' B': 纬度经度
1 1
3 1
1 3
3 3

确实,第一个点或坐标(1,1)在Area1中,第二个(3,1)在Area2中,第三个(1,3)在Area3中,第四个在Area4中。因此,宏应该复制'表1和#39;中的坐标对。到'表2'通过在第三栏附加相应的区域,即“C'”。在这种情况下,'表2'应该如下所示:

纬度经度区 1 1区1 3 1区2 1 3区3 3 3 Area4

我之前从未在VBA中编程过。我真的不知道该怎么做。请帮我。感谢。

1 个答案:

答案 0 :(得分:0)

首先将此宏添加到您的Excel文档作为新模块。按ALT-F11打开VB编辑器。按ALT-I-M插入新模块。

将以下代码复制到模块中。

Sub getarea()
Dim coordx, coordy, coords, area_location As String

For record_ROW = 2 To 5 '<======== set sheet row limits here
    Sheets("Sheet1").Select
    'read value to be matched
    coordx = Trim(Range("A" & record_ROW))
    coordy = Trim(Range("B" & record_ROW))
    coords = coordx & "," & coordy
    area_location = "undetermined"

    'search for answer in Sheet2
    Sheets("Sheet2").Select
    For source_ROW = 2 To 6 '<======== set sheet row limits here
        source_coords = Trim(Range("A" & source_ROW))
        If coords = source_coords Then area_location = "Area1"
    Next source_ROW

    'search for answer in Sheet3
    Sheets("Sheet3").Select
    For source_ROW = 2 To 6 '<======== set sheet row limits here
        source_coords = Trim(Range("A" & source_ROW))
        If coords = source_coords Then area_location = "Area2"
    Next source_ROW

    'search for answer in Sheet4
    Sheets("Sheet4").Select
    For source_ROW = 2 To 6 '<======== set sheet row limits here
        source_coords = Trim(Range("A" & source_ROW))
        If coords = source_coords Then area_location = "Area3"
    Next source_ROW

    'search for answer in Sheet5
    Sheets("Sheet5").Select
    For source_ROW = 2 To 6 '<======== set sheet row limits here
        source_coords = Trim(Range("A" & source_ROW))
        If coords = source_coords Then area_location = "Area4"
    Next source_ROW

    'write the answer
    Range("'Sheet1'!C" & record_ROW) = area_location
Next record_ROW

Sheets("Sheet1").Select

End Sub

当您准备好开始时,按F8一步一步地执行宏。当您准备好让它翻录时,按ALT-F4关闭编辑器。按ALT-F8并选择“getarea”以运行宏。

由于所有屏幕更新,此宏将运行相对较慢。您可以添加Application.ScreenUpdating = False来停用屏幕更新,请务必稍后使用Application.ScreenUpdating = True重新启用它。还有其他方法可以加快处理时间,提供进度指标以及其他花哨的功能。但如果按原样运行它就没有坏处。