2017-10-20 19 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 

私の問題は、私は1枚で約90「可能性」都市を持っているということで、他のシートとは異なります。 上記のコードは、特定のシートにない都市を印刷しています。

ありがとうございました

+0

あなたのコードがactivesheetは、あなたのコードを実行する時には何でもして取り組んでいます。これを実行するために1枚以上のシートを指定しようとしていますか? – QHarr

+0

また、コードの先頭にOption Explicitを使用して、変数のスペルと宣言をチェックします。 – QHarr

+0

QHarrありがとう、はい、それは動作していますが、それは列に入力されていないその都市の名前を返しています。 たとえば、 2チューリッヒ 0香港。 私は香港に価値がないので、印刷したくないです。 – Jonathan

答えて

1

都市を配列に入れ、その配列をループします。また、カウント範囲を範囲としてください。 0より大きいIfテストが存在するので、存在しない場合は都市を書き出しません。

すべて一緒に:各部に

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 

以下がV2から始まる列Vにおける空白のセルの前に最後に使用した行を取得します。最後に使用したセルの前に空のセルがある場合は、間違った最後の行が表示されます。その後

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

でVで最後に使用された行へのV2としてオーバーカウントする範囲を設定します。

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

:あなたと結果を出し書き込みを開始する場所を定義します

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

都市範囲をループして、カウント範囲内の特定の都市の出現を数えます。

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

IF文で、count> 0かどうかを調べます。

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

カウンタ変数を使用して1行により、第1ペースト位置からそれぞれの時間を相殺シートに書き出し:

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

あなたは天才です! 私はあなたのコードを勉強する必要がありますありがとうございます! – Jonathan

+1

私はあなたに役立ついくつかの説明を追加しました。これを書くより効率的な方法があるかもしれませんが、それはあなたが望むものを達成する方法です。 – QHarr

+0

うわー!素晴らしいQHarr、 私はコードを実行して、それは今働いていない、それは言う:Method 'Range' of object'_Worksheet 'failed。これは、set countRange = ws.Range(Cells(2、 "V")、Cells(ws.Range( "V2")。End(xlDown).Row、 "V"))を強調表示しています。 – Jonathan

関連する問題