Есть ли универсальный способ получить хорошее текстовое представление переменной в VBA? - PullRequest
4 голосов
/ 15 июня 2010

В VBA есть хороший способ получить текстовое представление переменной / объекта?Как и различные методы Java String.valueOf (...).

Ответы [ 2 ]

4 голосов
/ 15 июня 2010

За пределами CStr нет ничего встроенного, что имеет ограничения, которые вы заметили.Единственное, что вы можете сделать, это написать свое.К счастью, в VBA достаточно встроенных операторов («IsArray», «IsNumeric», «VarType» и т. Д.), Чтобы упростить его.(И это заставляет задуматься: «Почему бы просто не сделать« CStr »более мощным?» ...)

Функции, приведенные ниже, являются примером.Они предназначены для кода Excel / VBA, поэтому вам, вероятно, нет дела до реализаций подпрограмм, вызываемых в них для форматирования массивов и т. Д., Но они должны дать вам основную идею.

'Diagnostic formatting of variant as string
Public Function fmt(arg) As String
    If IsObject(arg) Then
        fmt = fmtObj_(arg)
    ElseIf IsArray(arg) Then
        fmt = fmtArr_(arg)

    'Note that this test must come after IsArray() since IsMissing() returns
    'True for an empty array parameter (created by calling Array())
    ElseIf IsMissing(arg) Then
        fmt = "<Missing>"
    Else
        Select Case VarType(arg)
            Case vbDouble

                'Since we're in Excel, don't include double type char (#)
                fmt = CStr(arg)
            Case vbString
                fmt = """" & arg & """"
            Case vbEmpty
                fmt = "<Empty>"
            Case vbBoolean, vbDate
                fmt = CStr(arg)
            Case vbError
                fmt = fmtExcelVBAError_(arg)
            Case vbLong
                fmt = CStr(arg) & "&"
            Case vbInteger
                fmt = CStr(arg) & "%"
            Case vbCurrency
                fmt = CStr(arg) & "@"
            Case vbNull
                fmt = "<Null>"
            Case Else
                fmt = "<Typename - " & TypeName(arg) & ">"
        End Select
    End If

    If Len(fmt) > MAX_FMT_LEN_ Then
        fmt = Left$(fmt, MAX_FMT_LEN_) & " <...>"
    End If
End Function


'As fmt(), but "normal" conversion for strings, numbers, and Empty
Public Function toStr(arg) As String
    If IsObject(arg) Then
        toStr = fmt(arg)
    Else
        If VarType(arg) = vbString Or VarType(arg) = vbEmpty Or IsNumeric(arg) Then
            toStr = CStr(arg)
        Else
            toStr = fmt(arg)
        End If
    End If
End Function
1 голос
/ 15 июня 2010

Вы пробовали: CStr(...)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...