首先我介绍一个例子:
我每天都有一张玩家的原始分数表,称为“原始分数”。
我还有这个修改表,我将应用到每个玩家的每日原始得分,它被称为“ScoreMod”。
我还有这张表来计算他们的总有效分数。其名为“总计”。
为了计算每个玩家的每日有效得分(原始得分+修正值),我使用以下函数。
=LET(
MyDate, FILTER(RawScore[Date],RawScore[Name]=Total[@Name]),
MyRawScore,FILTER(RawScore[Score],RawScore[Name]=Total[@Name]),
MyModifier,XLOOKUP(
MyDate,
FILTER(ScoreMod[Date], ScoreMod[Name]=Total[@Name],0),
FILTER(ScoreMod[Modifier], ScoreMod[Name]=Total[@Name],0), 0),
MyModifier + MyRawScore)
Run Code Online (Sandbox Code Playgroud)
这个功能运行得很好,如图所示。汤姆的有效分数计算正确。
然后我将上面的函数定义为EffectiveScore。
但是,当我尝试=SUM(EffectiveScore)在总表中使用 Tom 的总分时,结果不正确,因为它变成了 300。
但如果我用=SUM(+EffectiveScore)汤姆的总分,那么结果就是正确的总分,280。
我的问题是,为什么不带 a 的公式+不能得到正确的答案,为什么加上 a+就能得到正确的答案?
标题中的问题 - 我想确定 VBA 使用哪个随机数生成器,即在 Randomize 和 Rnd 中?根据微软的文档,Excel 本身使用 Mersenne Twister - 这显然非常好,但你不能播种。我似乎无法在 Microsoft 文档中找到 VBA 的答案。
我为此使用 Excel 365,因为我很欣赏这可能会因版本而异。
使用 VBA(Excel 365(16.0.12527.20880),德语)我试图根据Office VBA 参考将复选框 ( Checkbox1) 标题的删除线属性设置为这应该有效。False
下面的代码被放置在一个Module1(简化的),并且改变的透湿值UserForm1.Checkbox1(UserForm1和Checkbox1运行时期间是静态的,创建经由所述VBA的编辑器,而不是通过代码)。
Sub ChangeCheckBox()
UserForm1.CheckBox1.Caption = "Test" 'this triggers the Init-Procedure, which only sets the Height and Width of the UserForm. This shouldn't effect the problem, but I'm mentioning it here so it's clear that the form has been initialized. But if I leave it out, it's the same problem.
'Pre-Test - works fine
'Check initial value
Debug.Print UserForm1.CheckBox1.Font.Strikethrough 'returns false …Run Code Online (Sandbox Code Playgroud) 我正在尝试比较表中的两个单元格:
使用公式计算“MR”列=ABS([@Value]-A1)以确定“值”列的移动极差。“值”列中的值未四舍五入。“MR”列(B3 和 B4)中突出显示的单元格是相等的。我可以将公式输入=B3=B4到单元格中,Excel 会显示 B3 等于 B4。
但是当我在VBA中比较它们时,VBA说B4大于B3。我可以选择单元格 B3 并在“立即窗口”中输入以下内容? selection.value = selection.offset(1).value。该语句的评估结果为 false。
我尝试从公式中删除绝对值,认为这可能与它有关,但 VBA 仍然说它们不相等。
我尝试添加另一行,其中 Value=1.78,因此 MR=0.18。有趣的是,新行(B5)中的 MR等于B3,但不等于B4。
然后我尝试增加 A4 的小数以匹配其他值,现在 VBA 说它们相等。但是当我将绝对值添加回公式时,VBA 再次表示它们不相等。我再次删除了绝对值,现在 VBA 说它们不相等。
为什么 VBA 告诉我单元格不相等,而 Excel 却说它们相等?今后如何通过 VBA 可靠地处理这种情况?
我有下面的数据,其中 A 列包含一个公式,用于从另一张工作表中提取以下数据,这样如果修改原始工作表,则更新值。
对于每组金属,我希望创建如图所示的值的小计。
我很欣赏 excel 有一个小计功能,但是当我尝试实现这一点时,我收到一个错误,指出无法更改数组。有没有办法将它合并到动态数组中?
可能的 VBA 解决方案? 我在网上发现了以下 VBA 代码,它在某种程度上产生了我想要的效果,但是就像以前一样,这仅适用于纯数据,如果我将其应用于提取的数据,将返回相同的错误“无法修改数组”。
Sub ApplySubTotals()
Dim lLastRow As Long
With ActiveSheet
lLastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
If lLastRow < 3 Then Exit Sub
.Range("E5:M" & lLastRow).Subtotal GroupBy:=1, _
Function:=xlSum, TotalList:=Array(1, 2), _
Replace:=True, PageBreaks:=False, SummaryBelowData:=True
End With
End Sub
Run Code Online (Sandbox Code Playgroud)
作为完全不熟悉 VBA 的人,我不确定这段代码在应用于动态数组时有多大帮助。
如果有人能想出一种方法来实现如上图所示的所需输出,要么使用 VBA,要么通过修改创建动态数组的公式更好(不确定仅使用公式是否可行),我们将不胜感激。
我正在处理一个简单的 Excel 文件,其中包含一些工作表,在每个工作表中我都报告了工作的小时数和分钟数。我想将其显示为 313:32,即 313 小时 32 分钟,为此我使用了自定义格式[h]:mm
为了方便很少使用Excel的工人,我想到创建一些vba代码,这样他们不仅可以插入分钟,除了经典格式之外[h]:mm,这样他们还可以插入小时和分钟的值。我报告了一些我想要的示例数据。我插入的内容 -> 我想要的内容打印在单元格内
然后我格式化了每个可以包含时间值的单元格[h]:mm,并编写了这段代码
Public Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
On Error GoTo bm_Safe_Exit
With Sh
If IsNumeric(Target) = True And Target.NumberFormat = "[h]:mm" Then
If Int(Target.Value) / Target.Value = 1 Then
Debug.Print "Integer -> " & Target.Value
Application.EnableEvents = False
Target.Value …Run Code Online (Sandbox Code Playgroud) 我正在尝试实施 Microsoft 所说的最佳实践,但没有成功。这是由于 Excel 中现在支持新的动态数组。这是他们的文章,下面是具体部分。这里
\n\n\n最佳实践
\n如果针对 DA 版本的 Excel,则应优先使用 Range.Formula2,而不是 Range.Formula。
\n如果针对 Excel 的 Pre 和 Post DA 版本,您应该继续使用 Range.Formula。但是,如果您希望严格控制用户公式栏的公式外观,则应检测是否支持 .Formula2,如果支持,则使用 .Formula2,否则使用 .Formula
\n
在 VBA 中如何检测版本(Pre DA 或 Post DA)?
\n我已经在 Excel 中创建了宏,这些宏在旧版本的 Excel 中都可以很好地工作,但是一旦引入新版本,公式就会发生变化,因为它依赖于以前的默认值“隐式交集评估 (IIE)”。由于较新版本的 excel 中的方法被取代,所有 VBA 实现都依赖于旧方法,并且新的 excel@在公式中添加了隐式交集运算符。因为存在这会破坏复杂工作表的风险,所以我希望能够检测当前版本的 excel 是否支持动态数组,如果是这样,我希望能够将所有实现替换range.formula为range.formula2.
\xe2\x80\x98Detect Pre or Post DA version\nDim ExcelVersion As Variant\nExcelVersion = blabla bla test \xe2\x80\x98Some test function HERE, return vbTrue if Post …Run Code Online (Sandbox Code Playgroud) 我怀疑以前有人问过这个问题,但我找不到。
FILTER()即使指定了返回字符串,通常也会为空白行返回 0。
使用时filter()我经常得到空单元格的 0 返回值。假设 A 列中有 6 行数据:
abc
xyz
abc
xyz
abc
Run Code Online (Sandbox Code Playgroud)
如果我使用
FILTER(A10:A15, A10:A15 <> "xyz", "")
Run Code Online (Sandbox Code Playgroud)
我得到以下信息(有时):
abc
abc
0
abc
Run Code Online (Sandbox Code Playgroud)
这似乎有些难以预料。在我不想要的地方出现 0 是一个问题,需要额外的逻辑或过滤。这是一个已知的问题?除了明确过滤掉空白单元格之外,还有其他方法可以解决这个问题吗?
这似乎可以消除空单元格返回 0 的情况:
FILTER(A10:A15, (A10:A15 <> "xyz") * (A10:A15 <> ""), "")
Run Code Online (Sandbox Code Playgroud)
返回的是:
abc
abc
abc
Run Code Online (Sandbox Code Playgroud)
我可以接受这个解决方案,但它应该是不必要的。我最后还向人们解释了为什么我一遍又一遍地过滤空单元格。
顺便说一句,过滤掉 0 不起作用。FILTER()在读取单元格时似乎将单元格视为空白字符串,但在输出结果时则不然。
FILTER(A10:A15, (A10:A15 <> "xyz") * (A10:A15 <> 0), "")
Run Code Online (Sandbox Code Playgroud)
这将返回带有 0 的原始结果。
如果没有更好的解决办法,有解释吗?
我刚刚在 Excel VBA 中编写了这个简单的宏,用于合并一组选定的单元格:
Sub Macro_Merge()
Dim Temp As String
Dim S As Variant
Temp = ""
For Each S In Selection
If Temp = "" Then
Temp = CStr(S.Value)
Else:
Temp = Temp + "," + CStr(S.Value)
End If
Next
Selection.Merge
Selection.Value = Temp
Selection.VerticalAlignment = xlTop
End Sub
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我总是看到那个烦人的对话框,警告我在合并时丢失数据(这正是我在宏中试图避免的情况)。
我可以摆脱该对话框,配置Application的DisplayAlerts属性:
Application.DisplayAlerts = False
Selection.Merge
Selection.Value = Temp
Application.DisplayAlerts = True
Run Code Online (Sandbox Code Playgroud)
这工作正常。
因此,与Application默认对象一样,我尝试清理我的代码,如下所示:
DisplayAlerts = False
Selection.Merge
Selection.Value = Temp
DisplayAlerts = True …Run Code Online (Sandbox Code Playgroud) 我做了一些挖掘,但找不到类似的问题。使用 VBA 循环这很容易,但实际上只是由于兼容性/在线共享而尝试使用单元格公式获得相同的结果。
我有两列,正在尝试连接两列的所有可能值。
Col1 Col2
A 1
B 2
C
...etc...
Run Code Online (Sandbox Code Playgroud)
所以结果是:
A1
A2
B1
B2
C1
C2
...etc...
Run Code Online (Sandbox Code Playgroud)
理想的情况是寻找一种溢出的解决方案,这样我就不必拖拉公式,而是接受任何可以获得所需结果的建议。
蒂亚!
当获得此问题的公式解决方案时,插入行以使用标题分隔数据组,我尝试从溢出结果中删除第一行和最后一行。
这是使用的数据:
| A栏 | B栏 | C栏 | |
|---|---|---|---|
| 第 1 行 | 位置 | 物品 | 数量 |
| 第 2 行 | p1 | 帽子 | 2 |
| 第 3 行 | p3 | 帽 | 3 |
我开始于
=DROP(
REDUCE(0,ROW(A2:C3),LAMBDA(x,y,VSTACK(x,A1:C1,INDEX(A:C,y,),{"","",""}))),
1)
Run Code Online (Sandbox Code Playgroud)
然后,我不仅想删除 REDUCE 函数的起始值,还想删除最后一行,该行始终为空白。
为此我尝试过:
=DROP(
REDUCE(0,ROW(A2:C3),LAMBDA(x,y,VSTACK(x,A1:C1,INDEX(A:C,y,),{"","",""}))),.
{1,-1})
Run Code Online (Sandbox Code Playgroud)
我期望{1,-1}数组能够完成它(1对于它的第一行和-1最后一行)。然而这导致了:
我无法理解这种行为,所以我在更简单的范围和/或数组上尝试了它:
在A1我用过=SEQUENCE(3,3)
直接做同样的事情:=DROP(SEQUENCE(3,3),{1,-1}),给出了另一个结果:

有点有趣:=DROP(SEQUENCE(3,3),{1,1,1,1,1})
结果是{4,4,4,4,4}
我知道我可以使用 DROP 两次来获得所需的结果,但我无法解释这种行为。
这是因为数组的第一个参数改变了数组/范围的大小,而 Excel 无法在同一计算中引用它?