Как преобразовать целое число в строку в Excel VBA?

Ответы:

262

CStr(45) это все что вам нужно (функция Convert String)

Yosem
источник
1
CStr(45), точнее.
Куичи С. Накамура
это не будет работать для e + преобразованных чисел! то есть 7.7685099559e + 11 будет отображаться как "7.7685099559e + 11" не так, как ожидалось: "776850995590" Так что я скорее скажу, что это будет более общим:CStr(CDbl(***))
Mahhdy
Он может отвечать потребностям вопроса, но он также неполон и недостаточен в некоторых обстоятельствах. Часто (например, в целях именования файлов) вы можете захотеть создать числа с нулевым префиксом, такие, которые 7становятся 007. Вы также можете указать количество десятичных знаков или включить тысячи разделителей. Если эти детали важны для вас: excelfunctions.net/vba-format-function.html
cartbeforehorse
97

Попробуйте функцию CStr ()

Dim myVal as String;
Dim myNum as Integer;

myVal = "My number is:"
myVal = myVal & CStr(myNum);
Брайан
источник
51

В большинстве случаев вам не нужно «конвертировать»; VBA сделает безопасное неявное преобразование типов без использования таких конвертеров, как CStr.

Приведенный ниже код работает без каких-либо проблем, поскольку переменная имеет тип String, и неявное преобразование типа выполняется автоматически!

Dim myVal As String
Dim myNum As Integer

myVal = "My number is: "
myVal = myVal & myNum

Результат:

«Мой номер: 0»

Вам даже не нужно это придумывать, это тоже работает:

Dim myString as String
myString = 77

"77"

Единственный раз, когда вам потребуется конвертировать, это когда переменная Type неоднозначна (например, Type Variant или Cell Value(который является Variant)).

Даже в этом случае вам не придется использовать CStrфункцию, если вы соединяетесь с другой строковой переменной или константой. Как это:

Sheet1.Range("A1").Value = "My favorite number is " & 7

«Мой любимый номер 7»

Так что, действительно, единственный редкий случай - это когда вы действительно хотите сохранить целочисленное значение в варианте или в значении Cell, когда нет соединения с другой строкой (что, я бы добавил, довольно редкий случай):

Dim i as Integer
i = 7
Sheet1.Range("A1").Value = i

7

Dim i as Integer
i = 7
Sheet1.Range("A1").Value = CStr(i)

"7"

LimaNightHawk
источник
2
Я не понимаю, почему этот ответ не имеет больше голосов, учитывая, что это правда. Стоит отметить, что преобразование типов не всегда выполняется, это зависит от используемого оператора. Например, операция + не всегда расширяет целое число до строки.
Марк Ч
1
@MarkCh Я знаю, что это старое, но ... возможно, потому, что неприятные неявные преобразования VBA и вызовы членов по умолчанию делают такое большое количество кода VBA хрупким, удивительным и подверженным ошибкам? Не было бы вдвое меньше вопросов о VBA на SO, если бы не было неявных преобразований, неявной доступности, неявного доступа к элементу по умолчанию, неявных массивов на основе 1 с Option Base 1неявной типизацией с помощью Def[Type](boy that EVIL!), Неявного ... Вы получаете это - единственная хорошая неявная вещь в VBA - это неявный синтаксис вызова, который сделал явное Callустаревание.
Матье
7

В моем случае функция CString не была найдена. Но добавление пустой строки к значению также работает.

Dim Test As Integer, Test2 As Variant
Test = 10
Test2 = Test & ""
//Test2 is now "10" not 10
Джулиан Кучлбауэр
источник
2
Никто не говорил о том CString, что является функцией VB.NET. Конкатенация пустого строкового литерала для создания строки является довольно неудачным методом преобразования. Используется CStrдля явных преобразований типов - это неявное преобразование типов, вызывающее удивление любого, кто читает этот код. Извините, я нашел этот ответ так поздно после того, как он был опубликован, я хотел бы, чтобы я проголосовал за него намного раньше.
Матье
2

Если полученная вами строка окажется шестнадцатеричным числом, таким как E01, то Excel преобразует ее в 0, даже если вы используете функцию CStr, и даже если вы впервые поместите ее в переменную типа String. Одним из способов решения этой проблемы является добавление к началу значения.

Например, при извлечении значений из таблицы Word и переносе их в Excel:

strWr = "'" & WorksheetFunction.Clean(.cell(iRow, iCol).Range.Text)
dolphus333
источник
2

Кратчайший путь без объявления переменной - подсказки типа :

s$ =  123   ' s = "123"
i% = "123"  ' i =  123

Это не будет компилироваться Option Explicit. Типы не будут, Variantно StringиInteger

Slai
источник
0

Еще один способ сделать это - соединить два проанализированных участка числового значения вместе:

Cells(RowNum, ColumnNum).Value = Mid(varNumber,1,1) & Mid(varNumber,2,Len(varNumber))

Я нашел лучший успех с этим, чем CStr()потому CStr()что, кажется, не конвертирует десятичные числа, которые пришли из вариантов в моем опыте.

Джонатан
источник
0

Если у вас есть действительное целочисленное значение и вы хотите сравнить значения, вы можете просто продолжить сравнение, как показано ниже.

Sub t()

Dim i As Integer
Dim s  As String

' pass
i = 65
s = "65"
If i = s Then
MsgBox i
End If

' fail - Type Mismatch
i = 65
s = "A"
If i = s Then
MsgBox i
End If
End Sub
user2648008
источник
0

Принятый ответ подходит для небольших чисел, что особенно важно, когда вы берете данные из таблиц Excel. поскольку большие числа будут автоматически преобразованы в научные числа, то есть e + 10.
Поэтому я думаю, что это даст вам более общий ответ. Я не проверял, есть ли у него падение или нет.

CStr(CDbl(#yourNumber#))

это будет работать для e + преобразованных чисел! как разCStr(7.7685099559e+11) что будет показано как "7.7685099559e + 11" не так, как ожидалось: "776850995590" Так что я скорее скажу, что мой ответ будет более общим результатом.

С уважением, М

Mahhdy
источник
0

введите описание изображения здесь

    Sub NumToText(ByRef sRng As String, Optional ByVal WS As Worksheet)
    '---Converting visible range form Numbers to Text
        Dim Temp As Double
        Dim vRng As Range
        Dim Cel As Object

        If WS Is Nothing Then Set WS = ActiveSheet
            Set vRng = WS.Range(sRng).SpecialCells(xlCellTypeVisible)
            For Each Cel In vRng
                If Not IsEmpty(Cel.Value) And IsNumeric(Cel.Value) Then
                    Temp = Cel.Value
                    Cel.ClearContents
                    Cel.NumberFormat = "@"
                    Cel.Value = CStr(Temp)
                End If
            Next Cel
    End Sub


    Sub Macro1()
        Call NumToText("A2:A100", ActiveSheet)
    End Sub

Reffer: MrExcel.com - конвертировать числа в текст с помощью VBA

Гаджендра Сантош
источник