Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA用于使用动态数组筛选数据透视表_Excel_Vba_Pivot Table_Excel 2019 - Fatal编程技术网

Excel VBA用于使用动态数组筛选数据透视表

Excel VBA用于使用动态数组筛选数据透视表,excel,vba,pivot-table,excel-2019,Excel,Vba,Pivot Table,Excel 2019,我有下面的VB代码 Sub CountWordFrequencies() Dim InputSheet As Worksheet Dim WordListSheet As Worksheet Dim PuncChars As Variant, x As Variant Dim i As Long, r As Long, b As Long Dim txt As String Dim wordCnt As Long Dim AllWords As Range Dim PC As PivotCach

我有下面的VB代码

Sub CountWordFrequencies()
Dim InputSheet As Worksheet
Dim WordListSheet As Worksheet
Dim PuncChars As Variant, x As Variant
Dim i As Long, r As Long, b As Long
Dim txt As String
Dim wordCnt As Long
Dim AllWords As Range
Dim PC As PivotCache
Dim PT As PivotTable
Dim PF As PivotField
Application.ScreenUpdating = False
Set InputSheet = ActiveSheet
Set WordListSheet = Worksheets.Add(after:=Worksheets(Sheets.Count))
WordListSheet.Range("A1").Font.Bold = True
WordListSheet.Range("A1") = "All Words"
InputSheet.Activate
wordCnt = 2


PuncChars = Array(".", ",", ";", ":", "'", "!", "#", _
    "$", "%", "&", "(", ")", " - ", "_", "--", "+", _
    "=", "~", "/", "\", "{", "}", "[", "]", """", "?", "*")

r = 2

Dim NotRealWord As Variant
NotRealWord = Array("OF","THE")


Do While Cells(r, 1) <> ""

    txt = UCase(Cells(r, 1))

    For i = 0 To UBound(PuncChars)
        txt = Replace(txt, PuncChars(i), "")
    Next i

    txt = WorksheetFunction.Trim(txt)

    x = Split(txt)
    For i = 0 To UBound(x)
        WordListSheet.Cells(wordCnt, 1) = x(i)
        wordCnt = wordCnt + 1
    Next i
r = r + 1
Loop


WordListSheet.Activate
Set AllWords = Range("A1").CurrentRegion
Set PC = ActiveWorkbook.PivotCaches.Add _
    (SourceType:=xlDatabase, _
    SourceData:=AllWords)
Set PT = PC.CreatePivotTable _
    (TableDestination:=Range("C1"), _
    TableName:="PivotTable1")
With PT
    .AddDataField .PivotFields("All Words")
    .PivotFields("All Words").Orientation = xlRowField
    .PivotFields("All Words") _
        .AutoSort xlDescending, "Count of All Words"
End With
Set PF = ActiveSheet.PivotTables("PivotTable1").PivotFields("All Words")
With PF
    .ClearManualFilter
    .EnableMultiplePageItems = True
    For b = LBound(NotRealWord) To UBound(NotRealWord)
        .PivotItems(NotRealWord(b)).Visible = False
    Next b
End With
End Sub
Sub CountWordFrequencies()
将输入表作为工作表进行调整
将单词列表表设置为工作表
变型为暗蓬卡,变型为x
我长,r长,b长
以字符串形式显示文本
模糊的词
将所有单词作为范围
Dim PC作为数据透视缓存
数据透视表
Dim PF作为数据透视字段
Application.ScreenUpdating=False
设置InputSheet=ActiveSheet
Set WordListSheet=Worksheets.Add(后面:=Worksheets(Sheets.Count))
WordListSheet.Range(“A1”).Font.Bold=True
WordListSheet.Range(“A1”)=“所有单词”
输入表。激活
wordCnt=2
PuncChars=数组(“.”、“,”、“;”、“:”、“'”、“!”、“#”_
"$", "%", "&", "(", ")", " - ", "_", "--", "+", _
"=", "~", "/", "\", "{", "}", "[", "]", """", "?", "*")
r=2
作为变体的单词
NotRealWord=数组(“OF”,“THE”)
“当单元格(r,1)”时执行”
txt=UCase(单元格(r,1))
对于i=0至UBound(PuncChars)
txt=替换(txt,PuncChars(i),“”)
接下来我
txt=工作表函数.Trim(txt)
x=拆分(txt)
对于i=0到UBound(x)
WordListSheet.Cells(wordCnt,1)=x(i)
wordCnt=wordCnt+1
接下来我
r=r+1
环
WordListSheet.Activate
设置所有字=范围(“A1”)。当前区域
设置PC=ActiveWorkbook.PivotCaches.Add_
(SourceType:=xlDatabase_
SourceData:=所有字)
设置PT=PC.CreatePivotTable_
(表目的地:=范围(“C1”)_
TableName:=“数据透视表1”)
与PT
.AddDataField.PivotFields(“所有单词”)
.PivotFields(“所有单词”).Orientation=xlRowField
.PivotFields(“所有单词”)_
.AutoSort xlDescending,“所有单词的计数”
以
Set PF=ActiveSheet.PivotTables(“数据透视表1”).PivotFields(“所有单词”)
与PF
.ClearManualFilter
.EnableMultiplePageItems=True
对于b=LBound(NotRealWord)到UBound(NotRealWord)
.PivotItems(NotRealWord(b)).Visible=False
下一个b
以
端接头
这是一个词频分析函数,用户将从A2开始在a列中插入字符串列表。他们将单击运行此脚本的按钮。然后,脚本将字符串分解为单个单词,并创建一个数据透视表,该表将根据频率对每个单词的频率进行计数

以下是显示机构的图片:

  • 用户在A列上的输入
  • 结果
结果

现在我有一个过滤器的问题。最后,我希望pivot表自动过滤掉“NotRealWord”数组中的单词列表,因为这些单词不适合分析。我的代码只有在脚本能够在被分解的单词中找到数组列表中的所有值时才起作用。所以在我的示例中,我设置了NotRealWord=Array(“OF”,“THE”),pivot表字段中确实有这些单词,因此它可以完美地工作。但如果我添加了“BY”,它将返回此错误“无法获取数据透视字段类的PivotItems属性”。我该如何解决这个问题

或者更好的是,我如何使NotRealWord成为一个动态数组,它接受F列中的值列表,这样用户就可以添加更多他们想要过滤掉的单词,而无需修复代码(我的第一张图片也显示了F列)


请注意,我并不擅长VB。我知道如何阅读和适应复杂的代码,但不知道FB word的输入和输出。这里有一种可能的方法,它与您当前的方法略有不同,但应该满足您的需要:

Sub-WordCountTester()
将d标注为对象,k、i标注为长,ws标注为工作表
设置ws=ActiveSheet
Set d=WordCounts(ws.Range(“A2:A”)和ws.Cells(Rows.Count,“A”).End(xlUp.Row)_
ws.Range(“F2:F”和ws.Cells(Rows.Count,“F”).End(xlUp.Row))
'列出单词和频率
对于每个k In d键
ws.Range(“H2”)。调整大小(1,2)。偏移量(i,0)。值=数组(k,d(k))
i=i+1
下一个k
端接头
'rngTexts=包含要计算字数的文本的范围
'rngExclude=包含要从计数中排除的单词的范围
作为对象字典的公共函数字计数(rngTexts作为范围,RNGEExclude作为范围)
暗字,c作为范围,dict作为对象,regexp作为对象,w,wd作为字符串,m
Set dict=CreateObject(“scripting.dictionary”)
设置regexp=CreateObject(“VBScript.regexp”)”请参见下面的链接以获取参考
使用regexp
.Global=True
.MultiLine=True
.ignorecase=True
.Pattern=“[\dA-Z-]{2,}”至少两个字符。。。
以
'在输入范围上循环
对于rngTexts.单元格中的每个c
如果Len(c.值)>0,则
Set words=regexp.Execute(UCase(c.Value))
'循环匹配
用文字表示每一个w
wd=w。值“匹配的文本”
如果不是数字(wd),则“编辑:忽略数字”
'如果在“排除”范围内找不到单词,则递增计数
如果IsError(Application.Match(wd,rngExclude,0))那么
dict(wd)=dict(wd)+1
如果结束
其他的
调试。打印“过滤掉”,wd'不包括数字。。。
如果大于1个字符,则结束
下一个w
如果结束
下一个c
Set WordCounts=dict
端函数

正则表达式引用:

TIm,我很感激。让我来测试一下,如果我有任何问题,请告诉你。嗨,蒂姆,我能够在公共函数下添加“Set rngExclude=ActiveSheet.Range(“D:D”)”,以便对D列下的任何字符串进行解密。我可以问一下‘rngTexts=包含要计算字数的文本的范围是什么吗?如果没有它,函数仍然工作。您应该从另一个子函数调用该函数并在两个范围内传递,如
WordCountTester
所示-您不需要编辑该函数。此外,您是否可以帮助我添加一个逻辑,以便也不计算只有1个字符的任何内容?请参阅上面的编辑。