背景
最近,我一直试图更加熟悉将分隔字符串更改为 XML 以使用 Excel 进行解析FILTERXML并检索那些感兴趣的子字符串的概念。请注意,此功能在 Excel 2013 中可用,但不适用于 Excel for Mac 或 Excel Online。
对于分隔字符串,我的意思是使用空格作为分隔符的普通句子或可用于定义字符串中的子字符串的任何其他字符组合。例如,让我们想象以下内容:
ABC|123|DEF|456|XY-1A|ZY-2F|XY-3F|XY-4f|xyz|123
Run Code Online (Sandbox Code Playgroud)
题
因此,很多人都知道如何获取第n 个元素(例如:=TRIM(MID(SUBSTITUTE(A1,"|",REPT(" ",LEN(A1))),3*LEN(A1)+1,LEN(A1)))要检索456)。或其他combinationes有LEN(),MID(),FIND()和所有这些结构,我们如何使用FILTERXML使用更具体的标准来关注的提取子和清理满弦?例如,如何检索:
在回答了我之前关于水平数组与垂直数组的问题之后,我有一个关于其各自的分隔符的问题。
问题定义:
特此举例说明比较两个数组的错误方法:
{=SUMPRODUCT(--({"Apple","Pear"}={"Apple","Lemon","Pear"}))}
Run Code Online (Sandbox Code Playgroud)
如果是英文申请的国家/地区代码,则正确的方法是:
{=SUMPRODUCT(--({"Apple","Pear"}={"Apple";"Lemon";"Pear"}))}
Run Code Online (Sandbox Code Playgroud)
在英语的Excel版本中(最有可能不仅仅是英语),这些分隔符分别是,水平数组的逗号和;垂直数组的分号。关于此的大量在线信息。
但是,在应用程序上使用荷兰国家/地区代码的机器上工作时,这并不是一个完整的故事。令人沮丧的是,我的定界符;和分别不同\。能够很容易地检索分号,事实证明,要找到有关这些国际标准定界符的文档非常棘手。
解决方法:
事先不知道这些定界符会使在该应用程序的各种国际版本上的任何人都难以使用这些类型的公式。一个相当简单的解决方法是使用TRANSPOSE():
{=SUMPRODUCT(--({"Apple";"Pear"}=TRANSPOSE({"Apple";"Lemon";"Pear"})))}
Run Code Online (Sandbox Code Playgroud)
通过内置评估,我们可以检索反斜杠作为列分隔符。另一种方法是使用Application.International属性,它是xlColumnSeparator和xlRowSeparator。
题
我们都可以找到,甚至重写xlDecimalSeparator,并xlThousandsSeparator通过Excel文件(文件>选项>高级),或VBA( Application.DecimalSeparator = "-"),但我们在哪里可以找到:
xlRowSeparator,xlColumnSeparator还可以实际查看在您自己的应用程序中使用了哪些应用程序。寻找类似于千位和十进制分隔符和/或官方MS文档的界面。此外(没有专门寻找这个),还有:
我很好奇是否提供了官方文档,并且/或者是否可以进行上述操作。
我正在通过 VBA 向工作表添加一个公式,它应该是:
=UNIQUE(IF(TableA[ColumnA]=A1,TableA[ColumnB],""))
Run Code Online (Sandbox Code Playgroud)
这利用 Excel 中的新 SPILL 功能为我提供 B 列值列表,其中 A 列中的相关值与单元格 A 中的值相匹配。我还应用 UNIQUE 函数来删除任何多个空白 ("") 结果。
如果我手动将公式输入到 Excel 中,这非常有效,但是在使用 VBA 添加公式时,Excel 在公式中添加了 @ 符号,并导致它显示 #VALUE!。
用于添加公式的 VBA 行是:
=Cells(x,y).Formula = "=UNIQUE(IF(TableA[ColumnA]=A1,TableA[ColumnB],""""))"
Run Code Online (Sandbox Code Playgroud)
Excel 中的结果输出为:
=@UNIQUE(IF(TableA[@[ColumnA]]=A1,TableA[ColumnB],""))
Run Code Online (Sandbox Code Playgroud)
发生了什么,我错过了什么?
提前致谢!
所以这需要一些细节:
n,X,X,X,n 位于单元格 B5 至 F5 中
我需要得到以下输出:
1n,3x,1n
对于这个特定的行。
现在,n 和 X 代表针织中的针迹,“n”是背景颜色,“x”是前面颜色。
有一个单元格 B5:F12 数组代表行和针迹,因此每一行都有不同的针迹或背景颜色排列。
我需要避免使用 vba,因为这需要尽可能稳定,用户是我 90 岁的妈妈:),她所需要的只是一个输入名称和布局(我已经完成)和模式的地方每行的列表(也已排序)。
我开始考虑以下事情:
if(B5=C5,1&B5,"")
Run Code Online (Sandbox Code Playgroud)
但考虑到组合的数量,它会变得很长。
有任何想法吗?干杯。
新函数UNIQUE是否可以跨不同列使用并将输出溢出到单个列中?
所需的输出是UNIQUE一列中的值,基于中存在的所有值Columns: A, B, & C(示例中为红色的重复项)
UNIQUE(A7:C7)我会得到跨列的溢出范围(这甚至不提供跨列的唯一值,这是出乎意料的)UNIQUE(A2:A6) & UNIQUE(B5:B10) & UNIQUE(C2:C5)但这只是连接了值(也出乎意料但不相关)有没有办法简化这个公式?
=IFERROR(IF(LEN(RIGHT(K3,LEN(K3)-FIND("@",SUBSTITUTE(K3," ","@",LEN(K3)-LEN(SUBSTITUTE(K3," ",""))))))<4,IF(LEN(RIGHT(K3,LEN(K3)-FIND("@",SUBSTITUTE(K3," ","@",LEN(K3)-LEN(SUBSTITUTE(K3," ",""))))))< 3,IF(LEN("00"&LEFT(RIGHT(K3,2),1)+1&"l")>4,"0"&LEFT(RIGHT(K3,2),1)+1&"l","00"&LEFT(RIGHT(K3,2),1)+1&"l"),IF(LEN("0"&LEFT(RIGHT(K3,3),2)+1&"l")<4,"00"&LEFT(RIGHT(K3,3),2)+1&"l","0"&LEFT(RIGHT(K3,3),2)+1&"l")),IF(LEN(LEFT(RIGHT(K3,4),3)+1&"l")<4,IF(LEN(LEFT(RIGHT(K3,4),3)+1&"l")< 3,"00"&LEFT(RIGHT(K3,4),3)+1&"l","0"&LEFT(RIGHT(K3,4),3)+1&"l"),(LEFT(RIGHT(K3,4),3)+1&"l"))),IF(LEN(K3)<4,IF(LEN(K3)< 3,IF(LEN("00"&LEFT(K3,1)+1&"l")>4,"0"&LEFT(K3,1)+1&"l","00"&LEFT(K3,1)+1&"l"),IF(LEN("0"&LEFT(K3,2)+1&"l")<4,"00"&LEFT(K3,2)+1&"l","0"&LEFT(K3,2)+1&"l")),IF(LEN(LEFT(K3,3)+1&"l")< 3,"00" & LEFT(K3,3)+1&"l", IF(LEN(LEFT(K3,3)+1&"l")<4,"0"&LEFT(K3,3)+1&"l",LEFT(K3,3)+1&"l"))))
Run Code Online (Sandbox Code Playgroud)
它必须找到单元格中的最后一个数字,给它加 1 并在最后放一个 L。如果号码少于 3 位,则必须在号码前添加 0(083、071、043、005、002 等)。
Input - Output
1L - 002L
03R - 004L
483L - 484L
232R 233L 234L - 235L
08L 009L - 010L
4L 005R 6R - 007L
89L 90R 91L - 092L
Run Code Online (Sandbox Code Playgroud) 在用户窗体中,我有多个列表框。
我现在的情况是,第一个和第二个列表工作正常,但是当查询返回超过 1000 条记录时,我就达到了 LDAP 管理限制,这将返回运行时错误“错误 -2147016669”。正是这个问题,供参考。任何低于 1000 的值都会使代码运行顺利。
我正在进入不熟悉的领域,并且无法找到实现“页面大小”属性的正确方法,以便完整的用户列表将填充初始化的字典:
Private Sub Button1_Click()
Set rootDSE = GetObject("LDAP://rootDSE")
domainDN = rootDSE.Get("defaultNamingContext")
Set ado = CreateObject("ADODB.Connection")
ado.Provider = "ADSDSOObject"
ado.Open "ADSearch"
Set Dict_members = CreateObject("Scripting.Dictionary")
For n = 0 To ListBox2.ListCount - 1
If Me.ListBox2.Selected(n) = True Then
ldapFilter = "(sAMAccountName=" & Me.ListBox2.List(n) & ")"
Set objectList = ado.Execute("<LDAP://" & domainDN & ">;" & ldapFilter & ";distinguishedName,primaryGroupToken;subtree")
groupDN = objectList.Fields("distinguishedName")
groupRID = …Run Code Online (Sandbox Code Playgroud) 我对VBA很陌生,
今天开发一个宏,我发现了一些有趣的东西.
Range像这样使用是有效的:
Dim rg As Range
Set rg = ActiveSheet.Range("A1:B2")
Run Code Online (Sandbox Code Playgroud)
使用Range这样的方法不起作用并导致错误"对象变量未设置":
Dim rg As Range
rg = ActiveSheet.Range("A1:B2")
Run Code Online (Sandbox Code Playgroud)
但使用Range这样的工作:
Dim rg,rg2 As Range
rg = ActiveSheet.Range("A1:B2")
Run Code Online (Sandbox Code Playgroud)
这怎么可能?
冒着跑题的风险,我决定做一些问答,因为我对 MS 向 Excel365 引入的新功能感到非常兴奋;该LAMBDA()功能。如果普遍认为这是题外话,请告诉我,我可以删除问答。
该LAMBDA()函数基本上是您在 Excel 中创建自己的函数的方式。然后,您可以继续在整个工作簿中调用此函数。但是关于它的绝对伟大的事情(恕我直言)是它能够在函数内调用自己,因此是递归的!
SUBSTITUTE()如果必须交换多个字符,或者从某些字符甚至整个单词中清除字符串,我们都知道繁琐的嵌套函数。所以问题是:我们如何避免这种情况并利用LAMBDA()我们的优势?