2017-10-20 65 views
0

需要您的VBA专业知识来完成以下任务。 我需要在一列上做一个“MACORS”城市标识,并打印数字旁边的每个城市。 我有这样的代码:COUNTIF并打印计数的字符串

Public Sub CountLocation() 

Range("V2").Select 

Selection.End(xlDown).Select 
lastcell = ActiveCell.Address 

ActiveCell.Offset(2, 0).Value = "=countif(V2:" + lastcell + ", ""Zurich"")" 
ActiveCell.Offset(2, 1).Value = "Zurich" 
ActiveCell.Offset(3, 0).Value = "=countif(V2:" + lastcell + ", ""Armonk"")" 
ActiveCell.Offset(3, 1).Value = "Armonk" 
ActiveCell.Offset(4, 0).Value = "=countif(V2:" + lastcell + ", ""Hong Kong"")" 
ActiveCell.Offset(4, 1).Value = "Hong Kong" 
ActiveCell.Offset(5, 0).Value = "=countif(V2:" + lastcell + ", ""London"")" 
ActiveCell.Offset(5, 1).Value = "London" 
ActiveCell.Offset(6, 0).Value = "=countif(V2:" + lastcell + ", ""Madrid"")" 
ActiveCell.Offset(6, 1).Value = "Madrid" 

End Sub 

我的问题是我在一个片大约90“可能”城市,从其它片材而不同。 我上面的代码打印了一个不在特定工作表中的城市。

谢谢你的帮助

+0

您的代码正在与不管是当时的activesheet你运行你的代码。你是否试图指定一个或多个工作表来运行这个? – QHarr

+0

另外,在代码的顶部使用Option Explicit,以便检查变量的拼写和声明。 – QHarr

+0

谢谢QHarr,是的,它正在工作,但它返回了未输入到列中的城市的名称。 例如: 2苏黎世 0香港。 我不希望香港印刷,因为它没有价值。 – Jonathan

回答

1

把城市放在一个数组中并循环该数组。此外,将计数范围作为一个范围。有一个如果测试大于0,所以不会写出城市,如果不存在。

一起:

Option Explicit 

Public Sub CountLocation() 

    Dim wb As Workbook 
    Dim ws As Worksheet 
    Dim countRange As Range 

    Set wb = ThisWorkbook 
    Set ws = wb.ActiveSheet 'Change as appropriate 

    Dim lastRow As Long 
    lastRow = ws.Range("V2").End(xlDown).Row 'Update: Extracted this into a variable 

    Set countRange = ws.Range(ws.Cells(2, "V"), ws.Cells(lastRow, "V")) 

    Dim Cities() 
    Cities = Array("Zurich", "Armonk", "Hong Kong", "London", "Madrid") 

    Dim city As Long 
    Dim counter As Long 
    Dim startRange As Range 

    Set startRange = ws.Cells(lastRow, "V").Offset(2, 0) 

    counter = 2 

    For city = LBound(Cities) To UBound(Cities) 
     If Application.WorksheetFunction.CountIf(countRange, Cities(city)) > 0 Then 
     startRange.Offset(counter, 0) = Application.WorksheetFunction.CountIf(countRange, Cities(city)) 
     startRange.Offset(counter, 1) = Cities(city) 
     counter = counter + 1 
     End If 

    Next city 

End Sub 

注意事项的各个部分:

下在V列从V2开始空白单元格之前得到最后使用一行。如果在上次使用的单元格之前有空单元格,则会得到错误的最后一行。

lastRow = ws.Range("V2").End(xlDown).Row, "V") 

然后设置的范围为V2算到最后使用的排五:

Set countRange = ws.Range(ws.Cells(2, "V"),ws.Cells(lastRow, "V")) 

定义在那里你会开始写出来的结果:

Set startRange = ws.Cells(lastRow, "V").Offset(2, 0) 

在计数范围内循环计算特定城市发生的城市阵列:

Application.WorksheetFunction.CountIf(countRange, Cities(city)) 

将它包装在IF语句中以查看count是否大于0。

If Application.WorksheetFunction.CountIf(countRange, Cities(city)) > 0 

写出来的片从第一粘贴位置由一个行每次使用计数器变量抵消:

startRange.Offset(counter, 0) = Application.WorksheetFunction.CountIf(countRange, Cities(city)) 
startRange.Offset(counter, 1) = Cities(city) 
+0

你是天才! 我需要研究你的代码谢​​谢你! – Jonathan

+1

我已经添加了一些更多的解释来帮助你。可能有更有效的写作方式,但它是实现你想要的方法。 – QHarr

+0

哇!很好QHarr, 顺便说一句,我重新运行的代码,它现在不工作,它说:方法'范围'object'_Worksheet'失败。它突出显示Set countRange = ws.Range(Cells(2,“V”),Cells(ws.Range(“V2”)。End(xlDown).Row,“V”)) – Jonathan