String 是否有与PadLeft/PadRight等效的方法?

String 是否有与PadLeft/PadRight等效的方法?,string,vba,String,Vba,只是想知道,在VBA中是否有与VB.NET的PadLeft和PadRight方法等价的方法 现在,每当我想要获取一个字符串并使其具有前导空格的固定长度时,我都会根据该字符串的长度执行For…Next循环 例如,我将使用以下代码将字符串格式化为8个字符,并使用前导空格: intOrdNoLen = Len(strOrdNo) For i = 1 To (8 - intOrdNoLen) Step 1 strOrdNo = " " & strOrdNo Next 在VBA中,有没有

只是想知道,在VBA中是否有与VB.NET的PadLeft和PadRight方法等价的方法

现在,每当我想要获取一个字符串并使其具有前导空格的固定长度时,我都会根据该字符串的长度执行For…Next循环

例如,我将使用以下代码将字符串格式化为8个字符,并使用前导空格:

intOrdNoLen = Len(strOrdNo)
For i = 1 To (8 - intOrdNoLen) Step 1
    strOrdNo = " " & strOrdNo
Next

在VBA中,有没有一种方法可以在更少的行中完成同样的事情?

我不相信有任何显式的
PADLEFT
PADRIGHT
函数,但是您可以使用
SPACE
LEFT
RIGHT
的组合来为字符串预先添加空格,然后获取右侧X个字符数

PADLEFT

strOrdNo = RIGHT(Space(8) & strOrdNo, 8)
strOrdNo = LEFT(strOrdNo & Space(8), 8)

strOrdNo = LEFT(strOrdNo & String(8, "X"), 8)
如果要使用字符而不是空格,可以使用
STRING
而不是空格(下面的示例用X填充):

PADRIGHT

strOrdNo = RIGHT(Space(8) & strOrdNo, 8)
strOrdNo = LEFT(strOrdNo & Space(8), 8)

strOrdNo = LEFT(strOrdNo & String(8, "X"), 8)

你可以用这些。将它们放在公共模块中

'如果输入字符串长于总长度,则NB失败

Function PadLeft(text As Variant, totalLength As Integer, padCharacter As String) As String
    PadLeft = String(totalLength - Len(CStr(text)), padCharacter) & CStr(text)
End Function

Function PadRight(text As Variant, totalLength As Integer, padCharacter As String) As String
    PadRight = CStr(text) & String(totalLength - Len(CStr(text)), padCharacter)
End Function

由于我们通常在左侧填充,Format()函数更短、更简单:

Format(number, "    ")

Format(number, "00")

也可以在VBA中使用固定长度字符串:

Dim myString As String * 10
    myString = "test"
    Debug.Print myString, "(" & Len(myString) & ")" '// Prints "test          (10)"

虽然这只对右边的填充有用。

我通过重新分配变量解决了这个问题。
Format("abc","!@@@@@@") ' width >= 6; pad right side with spaces
Format("abc","@@@@@@") ' width >= 6; pad left side with spaces
在我的代码中,我从工作簿单元格中获取数据,并将其限制为5个字符(如有必要,请用足够的0..填充):


合并前两个答案(感谢LittleByTablesBrad)并注意辅助功能max,我建议:

Function PadLeft(ByVal text As Variant, ByVal totalLength As Integer, ByVal padCharacter As String) As String
    PadLeft = Right(String(totalLength, padCharacter) & CStr(text), max(totalLength, Len(CStr(text))))
End Function

Function PadRight(ByVal text As Variant, ByVal totalLength As Integer, ByVal padCharacter As String) As String
    PadRight = Left(CStr(text) & String(totalLength, padCharacter), max(totalLength, Len(CStr(text))))
End Function

Public Function max(ByVal x As Variant, ByVal y As Variant) As Variant
  max = IIf(x > y, x, y)
End Function

totalLength可能更适合命名为minimumLength,因为始终返回整个原始字符串,这可能会导致结果比minimumLength长。

噢,哇,我已经知道怎么做了。我想是工作了一整天。当然是我的首选方法。根据这里对PadLeft的描述,此代码与PadLeft的行为不匹配,因为示例:str.PadLeft(2,“四十二”)将返回“fo”而不是“四十二”。在原始代码中不会出现这种情况。我编辑了PADLEFT并进行了五次操作。最后一个参数应该是16,而不是8,否则无效。试试
?“!”&格式化(“a”,“a”)和“!”
,您将得到
!a,并带有一个数字:
?“!”&格式(1.23“)&“!”
给出
格式化填充空格的字符串时,请改用“@”格式字符占位符。请参阅:您可以在函数中添加一个检查,查看所提供的字符串是否长于输入长度,并进行相应的处理。这对于在Excel中填充数据以将长度大于255的字符串加载到SQL Server中非常有用。谢谢你的提示!如果你使用两次,你可以使用本文中描述的左填充方法。很好,很简单。然而,对于非常大量的数据,它比站在“步态”肩膀上的左/右方法慢2-3倍。这可能是最稳健的解决方案。也可以使用
Excel.WorksheetFunction.Max
,尽管这将使解决方案不再是纯VBA/VB经典。