2017-11-16 9 views
0

私はいくつかの入力データの各ヘッダーの下にある空白、非空白、合計エントリの数を計算するためにVBAコードを書いています。 1つのシートから別のシートに値をコピーして貼り付けるコードを追加し、値を削除し、各ヘッダーの下にある一意の値リスト、一意の値の数、およびそれらの一意の値がヘッダ。Excel VBA - 評価関数#NAMEを返しますか?エラー

ブランク:先にcountblank関数を使用しましたが、空のフィールドがスキップされるので、sumproduct(len(Range)=0)*1)に変更しました。 非ブランク:同様の関数を書いて、上記を計算しようとしました。

VBAがSumproduct機能を処理できません。ここに私が試してみましたアプローチは以下のとおりです。

1. Application.WorksheetFunction.Sumproduct(...) 
2. ..Number.. = "=Sumproduct(...)" 
3. ..Number.. = Evaluate("Sumproduct(...)") 
4. ..Number.. = Worksheet.Evaluate("Sumproduct(...)") 

以下はマクロのコードですが、私は、すなわち、INPUT_FILEに入力ワークシートをコードを書いています。

Sub Dedupe() 
ThisWorkbook.Worksheets("Control_Totals").Cells.ClearContents 

Dim lRow As Long 
Dim lCol As Long 
Dim i As Long 
Dim j As Long 
Dim Input_File As Worksheet 
Dim Output_File As Worksheet 
Dim Dedup_File As Worksheet 
Dim Col_Let As String 
Dim Rng As String 
Dim blank As String 
Dim non_blank As String 

Set Input_File = ThisWorkbook.Worksheets("Input") 
Set Output_File = ThisWorkbook.Worksheets("Control_Totals") 
Set Dedup_File = ThisWorkbook.Worksheets("Deduped") 

With Output_File 
     .Cells(1, 1) = "Field_Name" 
     .Cells(1, 2) = "Blanks" 
     .Cells(1, 3) = "Non-Blanks" 
     .Cells(1, 4) = "Total" 
End With 

'Finding the last row among all entries, including the blank ones 
lRow = Input_File.Cells.Find(What:="*", _ 
        After:=Range("A1"), _ 
        LookAt:=xlPart, _ 
        LookIn:=xlFormulas, _ 
        SearchOrder:=xlByRows, _ 
        SearchDirection:=xlPrevious, _ 
        MatchCase:=False).Row 

MsgBox "Last Row: " & lRow 

'Finding the last column header/field 
lCol = Input_File.Cells.Find(What:="*", _ 
        LookAt:=xlPart, _ 
        LookIn:=xlFormulas, _ 
        SearchOrder:=xlByColumns, _ 
        SearchDirection:=xlPrevious, _ 
        MatchCase:=False).Column 

MsgBox "Last Column: " & lCol 

i = 1 

'Finding the number of blank and non-blank entries for all the fields 
Do While i < lCol + 1 
Col_Let = ColumnLetter(i) 
Rng = "Input!" & "Col_Let" & "2" & ":" & "lRow" 


    Output_File.Cells(i + 1, 1) = Input_File.Cells(1, i) 

     blank = "SumProduct((Len(Rng) = 0) * 1)" 
     non_blank = "SumProduct((Len(Rng) > 0) * 1)" 

    Output_File.Cells(i + 1, 2).Value = Evaluate(blank) 
    Output_File.Cells(i + 1, 3).Value = Evaluate(non_blank) 
    Output_File.Cells(i + 1, 4) = lRow - 1 


    'Deduping the data under the headers 
    j = 0 
    For j = 1 To lRow 
    Dedup_File.Cells(j, i).Value = Input_File.Cells(j, i).Value 
    j = j + 1 
    Next 
    Dedup_File.Range(Cells(1, i), Cells(lRow, i)).RemoveDuplicates Columns:=1, _ 
    Header:=xlYes 

     i = i + 1 

Loop 

End Sub 

答えて

0

これらの行は、あなたは彼らが

Col_Let = ColumnLetter(i) 
Rng = "Input!" & "Col_Let" & "2" & ":" & "lRow" 

RNGはいつも含む文字列ですんだと思う何をしていない "入力をCol_Let2:!lRow" あなたは何を意味するか

ました:(と思うが) Rng = "入力!" & Col_Let &「2」&「:」& Col_Let & lRow

は、第二に、RNGは、これだけのVBAルーチン内に存在する - あなたはExcelの数式で使用することはできませんので、それは、Excelには何も意味しません。あなたは

blank = "SumProduct((Len(" & Rng.address & ") = 0) * 1)" 

を必要とし、最終的にSUMPRODUCTは、(それが自動的に配列に1を拡大するエクセルに依存しています)VBAでのトリックのこれらの並べ替えが好きではありません。よりよい解決策:

私は1枚のシートから値を別のコピーとペーストは、値をdedupesのコードを追加したい
Dim cBlank as long 
Dim cNonBlank as long 
Dim r as range 
For each r in rng 
if r.text = "" then 
    cBlank= cBlank+1 
else 
    cNonBlank = cNonBlank +1 
end if 
next r 
0

、各ヘッダーの下に私のユニークな値の数を一意の値のリストを与えます、その一意の値がヘッダーの下で発生している回数を示します。

ここで説明した内容はピボットテーブルで、行フィールドと数値エリアの両方に対象フィールドがカウントされています。