我通常在整个应用程序中出于各种原因使用这样的东西:
if (String.IsNullOrEmpty(strFoo))
{
FooTextBox.Text = "0";
}
else
{
FooTextBox.Text = strFoo;
}
Run Code Online (Sandbox Code Playgroud)
如果我要使用它很多,我将创建一个返回所需字符串的方法.例如:
public string NonBlankValueOf(string strTestString)
{
if (String.IsNullOrEmpty(strTestString))
return "0";
else
return strTestString;
}
Run Code Online (Sandbox Code Playgroud)
并使用它像:
FooTextBox.Text = NonBlankValueOf(strFoo);
Run Code Online (Sandbox Code Playgroud)
我总是想知道是否有一些东西是C#的一部分,它会为我做这件事.可以称之为的东西:
FooTextBox.Text = String.IsNullOrEmpty(strFoo,"0")
Run Code Online (Sandbox Code Playgroud)
第二个参数是返回值if String.IsNullOrEmpty(strFoo) == true
如果不是,有人有更好的方法吗?
我遇到了一些非常简单的代码问题.让我详细说明事实,看看是否有其他人可以复制这种行为.如果有人可以复制,我想解释它为什么会发生.
因此,让我从一个非常简单的代码行开始:
Dim arr() As Variant
arr = Range("A1:A10")
Run Code Online (Sandbox Code Playgroud)
这按预期进行,arr赋值为A1:A10
现在为什么以下代码行不起作用?
Dim arr() As Variant
arr = WorkSheets("Sheet1").Range("A1:A10")
Run Code Online (Sandbox Code Playgroud)
我得到一个运行时错误'13'类型不匹配,即使成功分配给数组相同的范围,只是没有工作表值.
但
Dim arr As Variant
arr = Worksheets("Sheet1").Range("A1:A10")
Run Code Online (Sandbox Code Playgroud)
和
Dim arr() As Variant
arr = Application.Transpose(Application.Transpose(Worksheets("Sheet1").Range("A1:A10")))
Run Code Online (Sandbox Code Playgroud)
工作
在你回答之前,请让我给你一些更多的事实.
Dim arr() As Variant
arr = Worksheets(1).Range("A1:A10")
Run Code Online (Sandbox Code Playgroud)
不起作用
并Sheets代替Worksheets所有人也给出了相同的错误.
通过使用下面Range("A1:A10").Worksheet.Name的工作代码确实它与活动引用表相同,它确实Sheet1在输出中说明了.
没有其他工作簿是打开的,所以它也不能引用另一个工作簿.
现在这最后一点代码只会增加我的困惑,因为它完全有效!
Dim arr() As Variant
Dim SampleRange As Range
Set SampleRange = Worksheets("Sheet1").Range("A1:A10")
arr = SampleRange
Run Code Online (Sandbox Code Playgroud)
因此,当我将其分配给范围变量时,使用相同方式在同一张纸上定义的相同方法现在可以正常工作.并使用它!正如预期的那样WorkSheets,Sheets无论我如何定义工作表,它都适用于和函数(我可以使用索引或工作表的名称,所有工作正常) …
我有A栏:
+--+--------+
| | A |
+--+--------+
| 1|123456 |
|--+--------+
| 2|Order_No|
|--+--------+
| 3| 7 |
+--+--------+
Run Code Online (Sandbox Code Playgroud)
现在,如果我输入:
=Match(7,A1:A5,0)
Run Code Online (Sandbox Code Playgroud)
进入我得到的纸张上的一个单元格
3
Run Code Online (Sandbox Code Playgroud)
结果是.(这是期望的)
但是当我进入这一行时:
Dim CurrentShipment As Integer
CurrentShipment = 7
CurrentRow = Application.Match(CurrentShipment, Range("A1:A5"), 0)
Run Code Online (Sandbox Code Playgroud)
CurrentRow获取值"Error 2042"
我的第一直觉是确保值7实际上在范围内,而且确实如此.
我的下一个可能是匹配功能需要一个字符串所以我试过
Dim CurrentShipment As Integer
CurrentShipment = 7
CurrentRow = Application.Match(Cstr(CurrentShipment), Range("A1:A5"), 0)
Run Code Online (Sandbox Code Playgroud)
无济于事.
所以我能想到的最好的方法是在大范围内(大约450k行)实现这个目的是使用以下Sue-do代码:
Range("A1").Copy ' A1 Contains Value I want to multiply column by
Range("MyTable[FooColumn]").PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply
Run Code Online (Sandbox Code Playgroud)
现在这样可行,但事实上我必须复制并粘贴该值似乎是多余的,因为值永远不会改变.
For Each c In Range("MyTable[MyColumnHeader]")
If IsNumeric(c) And Not c = "" Then
c.Value = c.Value * 453.592 ' The value that is in A1 from previos sample
End If
Next
Run Code Online (Sandbox Code Playgroud)
这有效,但速度较慢.因为它必须循环每个细胞.
我也尝试过:
With Range("MyTable[MyColumnHeader]")
.Value = .Value * 453.592
End With
Run Code Online (Sandbox Code Playgroud)
但是如果列中有多个值,则收到运行时错误类型不匹配错误.
我考虑插入一个列并使用"=R-1C * 453.592"Then 的formulaR1C1 .Value = .Value然后移动列并覆盖,但看起来很笨重,我认为也比粘贴倍增慢.
那么,有没有人有更好的方法来完成这项任务?
我目前会使用Range,Cells等许多不同方式使用相同的基本原理.
Range("A1", Range("A1").End(xlDown)).AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=Range("IV1"), Unique:=True
Dim myArr as Variant
myArr = Range("IV1", Range("IV1").End(xlDown))
Columns("IV").Delete
Run Code Online (Sandbox Code Playgroud)
有没有办法直接将这些唯一值加载到VBA中的任何类型的对象而无需复制到另一个位置?
假设我有这个公式
=MATCH(16,{5;10;15;20;25},-1)
Run Code Online (Sandbox Code Playgroud)
为什么它返回N/A?我希望它能回归4.

但更令我困惑的是,当我将它改为小于匹配(1)时,它按预期工作.

而且即使我知道它会匹配错误的事情,我仍然认为这将是很好,包括我尝试了所有值作为文本和它未返回N/A,虽然它也返回1不管我代替16用
