2017-10-26 1 views
1

私は作成した1番目の配列に書き込む文字数が限られているので、列にリストされている都市/可能な都市の数を数えるマクロを作成しようとしています。その通り)。 その後、2番目の配列でDim Cities2()を追加しましたが、「型の不一致エラー」というエラーが表示されました。助けてください。 Btw、私はまだアレイリストに200以上の都市を追加する必要があるが、それらをまだ追加していない。お手伝いありがとう。mutilpleマクロを組み合わせる

Public Sub CountLocation1() 

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

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

Set countRange = ws.Range(Cells(2, "V"), Cells(ws.Range("V2").End(xlDown).Row, "V")) 

Debug.Print countRange.Address 

Dim Cities() 
Cities = Array("Auckland", "Brisbane", "Melbourne", "Seoul", "Tokyo", "Sydney", "Bratislava", "Bangalore", "Chennai", "Gurgaon", "Hyderabad", "Kolkata", "New Delhi", "Noida", "Mumbai", "London", "Munich", "Unterfohring", "Aachen", "Abidjan", "Abington", "Alpharetta", "Amstelveen", "Amsterdam", "Anaheim", "Aquascalientes", "Arlon", "Ashland", "Atlanta", "Aurora", "Austin", "Barcelona", "Basel", "Batavia", "Bay Village", "Belton", "Berkshire", "Berlin", "Birmingham", "Bogota", "Boise", "Boston", "Bramley", "Brandon", "Brecksville", "Brentwood", "Bridgetown", "Brussels", "Budapest", "Buffalo Grove", "Bury", "Cairo", "Callahan", "Calumet City", "Cape Town", "Capitola", "Cardiff", "Carmel", "Centennial", "Chanhassen", "Charlotte", "Cheltenham", "Cincinnati", "Clearwater", "Clemson", "Cleveland", "Cohoes", "Columbia", "Columbus", "Conifer", "Cookeville", "Copenhagen", "Coral Gables", "Croydon", "Culver City", "Cumming", "Cutchogue", "Dallas", "Dallas Park", "Darmstadt", "Double Oak", "Dublin") 

Dim Cities2() 
Cities2 = Array("Eagle Rock", "East Hartford", "Elk Grove", "Encino", "Enfield", "Erfurt", "Eschborn", "Euless", "Fairfield", "Fenton", "Folkestone", "Folsom", "Frankfurt", "Franklin", "Frisco", "Garden City", "Geneva", "Germantown", "Glendale", "Glenview", "Gloucester", "Greensboro", "Greenwood", "Greenwood Village", "Grove", "Hamburg", "Hamilton", "Harrisonville", "Hartford", "Hatfield", "Hiawatha", "Hitchin", "Hofstetten", "Homewood", "Hope", "Houston", "Hudson", "Illinois", "Indianapolis", "Itasca", "Jackson", "Jacksonville", "Jaipur", "Johannesburg", "Jordbro", "Katy", "Kirkwood", "Ladera Ranch", "Lake Forest", "Lakewood", "Lancaster", "Largo", "Lawrenceville", "Leawood", "Lexington", "Liberty", "Lincoln", "Lockport", "Lombard", "Luxembourg", "Lörrach", "Madrid", "Manchester", "Maple Glen", "Martins Ferry", "Marupe", "Masontown", "Matthews", "McKinney", "Mechanicsville", "Middletown", "Milan") 

Dim city As Long 
Dim counter As Long 
Dim startRange As Range 
Set startRange = ws.Cells(ws.Range("V2").End(xlDown).Row, "V").Offset(2, 0) 

counter = 2 

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

    End If 

Next city 


End Sub 
+0

'LBOUND()'と 'UBound関数は、()'パラメータとして単一の配列を取ることができます2つを通過しました。これらは分離する必要があります。 –

+0

For city = LBound(都市)をUBound(都市)に&city = LBound(都市2)にUBound(都市2)に使用できますか? – Jonathan

+0

これは好きではありません。ネストされたループを作成することはできますが、コメントセクションで説明することは難しいです。 –

答えて

1

別のアプローチを試すことができます。

Dictionaryオブジェクトを作成し、都市をキーとして追加します。辞書についての良いことは、キー(市)が存在するかどうかを確認できることです。

市がある場合は、値(カウンター)を増やします。そうでない場合は、値1を付け加えてください。

以下の例では、列Aにあるリストを追加しています。

Sub GetCityCount() 

    Dim ws As Worksheet 
    Dim objDict As Object 

    Set ws = ThisWorkbook.ActiveSheet 
    Set objDict = CreateObject("Scripting.Dictionary") 

    Dim lngCount As Long 
     lngCount = ws.Cells(Rows.Count, "A").End(xlUp).Row 'Column A 

    Dim idx As Long 
    For idx = 1 To lngCount 
     If Not objDict.Exists(ws.Cells(idx, 1).Value) Then 
      'Add to dictionary with a count of 1 
      objDict.Item(ws.Cells(idx, 1).Value) = 1 
     Else 
      'Increment counter 
      objDict.Item(ws.Cells(idx, 1).Value) = objDict.Item(ws.Cells(idx, 1).Value) + 1 
     End If 
    Next 

    'Test 
    Dim k As Variant 
    For Each k In objDict.Keys 
     Debug.Print "Key: " & k & ", Count: " & objDict(k) 
    Next k 
End Sub 

サンプルデータ:

B

B

C

C

C

D

E

F

F

G

H

R

T

T

T

出力:

'Key: A, Count: 2 
'Key: B, Count: 2 
'Key: C, Count: 3 
'Key: D, Count: 1 
'Key: E, Count: 1 
'Key: F, Count: 2 
'Key: G, Count: 1 
'Key: H, Count: 1 
'Key: R, Count: 1 
'Key: T, Count: 3 
+0

ありがとう!!私はそれを試してみましょう! – Jonathan

+0

プロジェクトに関連するライブラリをどのように含めるかについて、いくつかの行を含めることができます。デフォルトでは、ほとんどのバージョンに辞書は含まれていないと思います。 – eirikdaude

+0

@eirikdaude私はプロジェクトにライブラリを含めていません。上で見てきたように、辞書オブジェクトは 'CreateObject(" Scripting.Dictionary ")を呼び出すことでレイトバインドされます。 –

0

単一の文字または文字の組み合わせを使用すると、カウンタの読みやすさが向上します。 i, j, x, y, i1, i2 ...などを見るたびに。あなたはそれがカウンターであることを知るべきです。

LBoundとUBoundの最初のパラメータはArrayで、2番目のパラメータは対象のDimensionです。 For Eachループで使用される変数として名詞を使用するのが一般的である

For x = LBound(Cities) To UBound(Cities) 
    Debug.Print Cities(x) '1D Array 
Next 

For x = LBound(Cities) To UBound(Cities) 
    Debug.Print Cities(x, 2) 'The 2 column of a 2D Base 1 array 
Next 

For x = LBound(Cities, 2) To UBound(Cities, 2) 
    '2nd column of a 2D Base 1 array 
Next 

:ここ

は、配列を反復処理するために使用される典型的なForループです。典型的なパターンを次に示します。

注:状況に応じて、変数はVariantまたはObjectタイプのいずれかである必要があります。バリアント型は常に機能します。このループは、1D配列または多次元配列で使用できます。このループは、配列の各要素を反復処理します。最初の列(次元)の要素を完全に反復した後、次の列(次元)の先頭で開始します。

Dim city As Variant 

For Each city In Cities 
    Debug.Print city 
Next 
+0

大変!出来た! – Jonathan