2017-12-12 6 views
0

のセルの範囲を参照し、Iは(カテゴリ変数の多くの列を含むテーブル)を有する:インデクシングVBAを介して別のワークシートにExcelで

A E 
S E 
D YU 
R T 
FD R 
FD RT 
D YU 
S T 
AS R 
D RR 
D R 

Iは、(各別個の用語の頻度)たい:

A 1 E 2 
S 2 YU 2 
D 4 T 2 
R 1 R 3 
FD 2 RT 1 
AS 1 RR 1 

私は各用語の頻度を計算しています。

Sub ff() 
    Range("B1:B6").Select 
    Selection.FormulaArray = "=COUNTIFS(Sheet1!C[-1],Sheet2!RC[-1]:R[5]C[-1])" 
    Range("D1").Select 

End Sub 

しかし、私は各列をループし、別のシートに頻度カウントを入れたいと思います。これまでのところ、私が持っている:私はエラーを取得しておく場所

Sub Macro1() 
    Sheets("Sheet1").Select 
    lcol = Cells(1, Columns.Count).End(xlToLeft).Column 
    N = Cells(Rows.Count, 1).End(xlUp).Row 

    For j = 1 To lcol 
     Range(Cells(1, j), Cells(N, j)).Select 
     Selection.Copy 
     Sheets("Sheet2").Select 
     Cells(1, 2 * j - 1).Select 
     ActiveSheet.Paste 

     Columns(2 * j - 1).RemoveDuplicates Columns:=1, Header:=xlNo 
     nr = Cells(Rows.Count, 2 * j - 1).End(xlUp).Row 
     Range(Cells(1, 2 * j), Cells(nr, 2 * j)).Select 
     *Selection.FormulaArray = "=COUNTIFS(Sheet1!C[" & j & "],Sheet2!RC[-1]:R[5]C[-1])" 
     Sheets("Sheet1").Select 
    Next j 

End Sub 
  • です。どのようにして、式を使用して別のワークシート範囲のセルを索引付けで参照できますか。正しい列を参照するためにjを使用したいと思います。

私はRefereing to a range of cell in another sheetの助言に従ったが、明示的な細胞を参照している。私の場合は、明示的なセルを参照しますが、インデックス参照(j)を参照します。辞書を使ってコメントで述べたように

Sheets(2).Range("F15:AK46").Select 

が同様に私に

+1

私はおそらくこのために辞書を使用して、キーが既に例えば存在している場合それから、関連する値に1を加えます。 – QHarr

+0

最終的な範囲が分かったら、元の数式と同じループ外の範囲式を設定してください。 – QHarr

答えて

1

をエラーを与えたこと

ノートが最善のアプローチです。あなたのコードは以下のようになります。結果を印刷または使用する方法はわかりませんが、この例では「結果」という名前のシートが作成され、存在する場合はそれをクリアして新しい結果を書き出します。

Option Explicit 
Sub CountOccurrences() 
    Dim i As Long 
    Dim j As Long 
    Dim cnt As Long 
    Dim lCol As Integer 
    Dim N As Long 
    Dim key As Variant 
    Dim dict As Object 
    Dim WS As Worksheet 
    Dim WS_Result As Worksheet 

    'Set objects and create a sheet to print results 
    Set WS = ThisWorkbook.Worksheets("Sheet1") 'change the name of the sheet to whatever you have 

    On Error GoTo Handler 
    Set WS_Result = ThisWorkbook.Worksheets("Results") 
    On Error GoTo 0 

    WS_Result.Cells.Clear 

    'Count the columns 
    lCol = WS.Cells(1, WS.Columns.Count).End(xlToLeft).Column 

    'Loop thru all columns and count occurrences 
    For j = 1 To lCol 
     'Find the last row 
     N = WS.Cells(WS.Rows.Count, lCol).End(xlUp).Row 

     'Create a new dictionary 
     Set dict = CreateObject("scripting.dictionary") 

     For i = 1 To N 
      key = WS.Cells(i, j).Value 
      If dict.exists(key) = False Then 
       dict.Add key, 1 'key=cell value, item=count of that value 
      Else 
       dict(key) = dict(key) + 1 
      End If 
     Next i 

     'Print the results 
     cnt = 0 
     For Each key In dict.keys 
      cnt = cnt + 1 
      WS_Result.Cells(cnt, (j - 1) * 2 + 1).Value = key 
      WS_Result.Cells(cnt, (j - 1) * 2 + 2).Value = dict(key) 
     Next key 

     'Destroy the dictionary to startover 
     Set dict = Nothing 
    Next j 

    Exit Sub 
Handler: 
    Set WS_Result = ThisWorkbook.Worksheets.Add 
    WS_Result.Name = "Results" 
    Resume 
End Sub 

結果のスナップショット

enter image description here

+0

@Alex私はレイトバインディングを使用しました。これは、問題のないコードで辞書を使用するようにしましたが、辞書やそのメソッドなどを使用したい場合は、早期バインディング**を使用することをお勧めします。これは、/VBEの参照と** Microsoft Scripting Runtime **を確認してください。その場合、新しい辞書オブジェクトの定義は辞書の詳細については 'dim dict = New dictionary'と同じくらい簡単です:https://excelmacromastery.com/vba-dictionary/ – Ibo

関連する問題