【问题标题】:VBA Excel Characters and Spaces Concatenating Multiple Strings连接多个字符串的 VBA Excel 字符和空格
【发布时间】:2015-06-26 19:58:33
【问题描述】:

我需要创建一个错误代码字符串,其中某些错误字符占据字符串中的某些位置。

假设您有代码 F,它必须在位置 2

输出:_F

现在,如果我们的代码 G 位于位置 5

输出:____G

现在如果我有两个错误怎么办?我怎样才能输出这个字符串:

_F__G

用户错误提示:

我的代码:

ErrorCode = Space(CodeNumber.Value) + CodeCharacter.Value

有没有简单的方法来做到这一点?我知道我可以为第一个代码和第二个代码执行此操作,然后取较早的数字 (2) 并从 (5) 中减去它并取 1 离开,然后空格并添加字符。但是当我们有多个代码和空格时,这似乎很混乱和困难。

当我在 VBA 中添加两个字符串时会发生什么?说“___A”+“_B”我假设它是“___A_B”。

有没有办法得到“_B_A”?

谢谢!

------------在尝试了两个答案的想法之后----- ---

我得到这个只返回一个错误代码

Private Sub ExportError_Click()
    Dim myErr As String
    myErr = ""

Dim myFile As String
myFile = "C:\Reformatted.txt"
Open myFile For Output As #1

    If F_2 = True Then
    AddCode "F", 2, myErr
    ElseIf G_3 = True Then
    AddCode "G", 3, myErr
    ElseIf H_4 = True Then
    AddCode "H", 4, myErr
    End If

Print #1, myErr

Close #1
Shell "C:\Windows\Notepad.exe C:\Reformatted.txt", 1

End Sub

Function AddCode(Lett As String, Pos As Long, ByRef ErrString As String)
    If Pos > Len(ErrString) Then
        ErrString = ErrString & Space(Pos - Len(ErrString))
    End If
    Mid(ErrString, Pos, 1) = Lett
End Function

Private Sub UserForm_Click()

End Sub

【问题讨论】:

  • 从你的问题中不清楚你需要如何组合不同的代码(它们是否来自不同的来源)或者你如何确定哪个角色需要放在哪个位置。
  • @TimWilliams 好问题!我进一步澄清了一点。它来自文本框。

标签: excel vba character space string-concatenation


【解决方案1】:
Sub Tester()
    Dim myErr As String

    AddCode "F", 2, myErr
    AddCode "G", 5, myErr
    AddCode "A", 1, myErr

    Debug.Print myErr
End Sub

Function AddCode(Lett As String, Pos As Long, ByRef ErrString As String)
    If Pos > Len(ErrString) Then
        ErrString = ErrString & Space(Pos - Len(ErrString))
    End If
    Mid(ErrString, Pos, 1) = Lett
End Function

从你的例子:

Private Sub ExportError_Click()
    Dim myErr As String
    myErr = ""

    Dim myFile As String
    myFile = "C:\Reformatted.txt"
    Open myFile For Output As #1

    If F_2 = True Then AddCode "F", 2, myErr
    If G_3 = True Then AddCode "G", 3, myErr
    If H_4 = True Then AddCode "H", 4, myErr

    Print #1, myErr

    Close #1
    Shell "C:\Windows\Notepad.exe C:\Reformatted.txt", 1

End Sub

【讨论】:

  • 为什么是“Debug.print”?
  • myErr 不会接受两个错误。我接受了 1。如果您有任何提示,请告诉我。
  • 嘿,蒂姆,这很好。其中一个代码的位置为 0(第一个字母是代码。我如何确保没有错误?错误是:“Mid(ErrString, Pos, 1) = Lett” 但是因为 Pos 会是0 我认为它不起作用?
  • Nvm 我用这个解决了这个问题: If Pos = 0 Then ErrString = ErrString + "F" Else Mid(ErrString, Pos, 1) = Lett End If
【解决方案2】:

最好使用数组来保存错误代码,然后在最后连接数组中的每个值以获得完整的错误代码。然后您可以通过数组索引访问它们的正确位置。

Dim codes(0 To 4) As String
Dim errorString As String
Dim code As Variant

codes(1) = "F"
codes(4) = "G"

For Each code In codes
    If code <> "" Then
        errorString = errorString + code 'if there is a code, insert it
    Else
        errorString = errorString + " " 'if no code, insert a space
    End If
Next code

我对错误进行了硬编码,但如果您在某处有一个列表,则可以循环遍历它们并像下面的伪代码一样分配它们:

For Each error In errors
    codes(error.CodeNumber) = error.CodeCharacter
Next error

【讨论】:

  • 嗨,迈克,对于每个实例/条目,用户将选中和取消选中任何相关的错误框。万一这会影响你的代码。
【解决方案3】:

@Mike 或@TimWilliams 的解决方案都可以工作 - 您的(新?)问题是您如何选择要添加到错误字符串中的项目。当您使用 'ElseIf' 时,您只会得到三个条件之一。

也就是说,这里还有其他几个选项。首先,类似于 Mike 的回答,可以使用 Byte 数组...

Private Sub ExportError_Click()
    Dim myErr() As Byte
    myErr = StrConv(String$(5, " "), vbFromUnicode)

    Dim myFile As Integer
    myFile = FreeFile
    Open "C:\Reformatted.txt" For Output As #myFile

    If F_2 = True Then myErr(1) = CByte(Asc("F"))
    If G_3 = True Then myErr(2) = CByte(Asc("G"))
    If H_4 = True Then myErr(3) = CByte(Asc("H"))

    Print #myFile, StrConv(myErr, vbUnicode)
    Close #myFile

    Shell "Notepad.exe C:\Reformatted.txt", 1
End Sub

...或者我个人的喜好,字典:

Private Sub ExportError_Click()
    Dim myErr As New Scripting.Dictionary
    Dim pos As Integer

    'Initialize to spaces.
    For pos = 1 To 5
        myErr.Add pos, " "
    Next pos

    Dim myFile As Integer
    myFile = FreeFile
    Open "C:\Reformatted.txt" For Output As #myFile

    If F_2 = True Then myErr(2) = "F"
    If G_3 = True Then myErr(3) = "G"
    If H_4 = True Then myErr(4) = "H"

    Print #myFile, Join$(myErr.Items, vbNullString)
    Close #myFile

    Shell "Notepad.exe C:\Reformatted.txt", 1
End Sub

请注意,要使用字典,您需要引用 Microsoft 脚本运行时。在 VB 编辑器的菜单中,转到 Tools->References...,然后选中“Microsoft Scripting Runtime”旁边的框。您可能需要滚动列表中的一种方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2016-09-20
    • 2017-08-17
    • 2018-07-02
    • 2012-05-10
    • 2014-01-19
    • 2012-09-26
    相关资源
    最近更新 更多