Jak przekonwertować liczbę całkowitą na ciąg w programie Excel VBA?

172

Jak przekonwertować liczbę całkowitą „45” na wartość ciągu „45” w programie Excel VBA?

Co tam
źródło

Odpowiedzi:

262

CStr(45) to wszystko, czego potrzebujesz (funkcja Convert String)

Yosem
źródło
1
CStr(45), być precyzyjnym.
Kouichi C. Nakamura
to nie zadziała dla liczb przekonwertowanych e +! tzn. 7.7685099559e + 11 zostanie pokazane jako „7.7685099559e + 11” nie zgodnie z oczekiwaniami: „776850995590” Więc raczej powiem, że będzie to bardziej ogólne:CStr(CDbl(***))
Mahhdy
Może odpowiadać na potrzeby pytania, ale jest też niepełny i niewystarczający w pewnych okolicznościach. Często (na przykład dla celów nazewnictwa plików) może chcesz stworzyć zerowe-prefiksem liczby, tak że 7staje 007. Możesz także określić liczbę miejsc dziesiętnych lub dołączyć separatory tysięcy. Jeśli te szczegóły są dla Ciebie ważne: excelfunctions.net/vba-format-function.html
cartbeforehorse
97

Wypróbuj funkcję CStr ()

Dim myVal as String;
Dim myNum as Integer;

myVal = "My number is:"
myVal = myVal & CStr(myNum);
Brian
źródło
51

W większości przypadków nie musisz „konwertować”; VBA wykona za Ciebie bezpieczną niejawną konwersję typów bez użycia konwerterów, takich jak CStr.

Poniższy kod działa bez żadnych problemów, ponieważ zmienna jest typu String, a niejawna konwersja typu jest wykonywana automatycznie!

Dim myVal As String
Dim myNum As Integer

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

Wynik:

„Mój numer to: 0”

Nie musisz nawet mieć takiej fantazji, to też działa:

Dim myString as String
myString = 77

„77”

Konwersja będzie potrzebna tylko wtedy, gdy zmienna Typ jest niejednoznaczna (np. Wariant typu lub komórka Value(która jest wariantem)).

Nawet wtedy nie będziesz musiał używać CStrfunkcji, jeśli składasz z inną zmienną lub stałą typu String. Lubię to:

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

„Moja ulubiona liczba to 7”

Tak naprawdę jedynym rzadkim przypadkiem jest sytuacja, gdy naprawdę chcesz przechowywać wartość całkowitą w wariancie lub wartości komórki, gdy nie jest ona również łączona z innym ciągiem (co jest dość rzadkim przypadkiem pobocznym, mogę dodać):

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
źródło
2
Nie rozumiem, dlaczego ta odpowiedź nie ma większej liczby głosów, skoro jest prawdziwa. Warto zauważyć, że konwersja typów nie zawsze jest wykonywana, zależy to od używanego operatora. Na przykład operacja + nie zawsze spowoduje poszerzenie liczby całkowitej do łańcucha.
Mark Ch
1
@MarkCh Wiem, że to jest stare, ale ... być może dlatego, że nieprzyjemne niejawne konwersje VBA i domyślne wywołania członków są tym, co sprawia, że ​​tak wiele kodu VBA jest kruche, zaskakujące i podatne na błędy? Nie byłoby o połowę mniej pytań VBA w SO, gdyby nie niejawne konwersje, niejawna dostępność, niejawny domyślny dostęp do składowych, niejawne tablice oparte na 1 z Option Base 1, niejawne wpisywanie z Def[Type](chłopiec to ZŁE!), Niejawne ... rozumiesz - jedyną dobrą niejawną rzeczą w VBA jest niejawna składnia wywołania, która sprawiła, że ​​jawne stało się Callprzestarzałe.
Mathieu Guindon
7

W moim przypadku nie znaleziono funkcji CString. Ale dodanie pustego ciągu do wartości też działa.

Dim Test As Integer, Test2 As Variant
Test = 10
Test2 = Test & ""
//Test2 is now "10" not 10
Julian Kuchlbauer
źródło
2
Nikt nie mówił o tym CString, co jest funkcją VB.NET. Łączenie pustego literału ciągu w celu utworzenia łańcucha jest dość kiepską metodą konwersji. Używaj CStrdo jawnych konwersji typów - jest to niejawna konwersja typów i budzi brwi każdego czytającego ten kod. Przepraszam, że znalazłem tę odpowiedź tak późno po jej opublikowaniu, żałuję, że nie mogłem jej ocenić znacznie wcześniej.
Mathieu Guindon
2

Jeśli ciąg, który ciągniesz, jest liczbą szesnastkową, taką jak E01, program Excel przetłumaczy go na 0, nawet jeśli użyjesz funkcji CStr, a nawet jeśli najpierw zdeponujesz go w zmiennej typu String. Jednym ze sposobów obejścia tego problemu jest dodanie „na początku wartości”.

Na przykład podczas wyciągania wartości z tabeli programu Word i przenoszenia ich do programu Excel:

strWr = "'" & WorksheetFunction.Clean(.cell(iRow, iCol).Range.Text)
dolphus333
źródło
2

Najkrótszym sposobem bez deklarowania zmiennej są wskazówki dotyczące typów :

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

To się nie skompiluje z Option Explicit. Nie będzie typów Variantale StringiInteger

Slai
źródło
0

Innym sposobem jest połączenie dwóch przeanalizowanych sekcji wartości liczbowej:

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

Odniosłem większy sukces niż to, CStr()że CStr()wydaje się, że nie konwertuje liczb dziesiętnych pochodzących z wariantów z mojego doświadczenia.

Jonathan
źródło
0

Jeśli masz prawidłową wartość całkowitą i Twoim wymaganiem jest porównanie wartości, możesz po prostu wykonać porównanie, jak pokazano poniżej.

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
źródło
0

Zaakceptowana odpowiedź jest dobra dla mniejszych liczb, co najważniejsze, gdy pobierasz dane z arkuszy Excela. ponieważ większe liczby zostaną automatycznie zamienione na liczby naukowe, tj. e + 10.
Więc myślę, że to da ci bardziej ogólną odpowiedź. Nie sprawdziłem, czy ma to jakiś upadek, czy nie.

CStr(CDbl(#yourNumber#))

to zadziała dla liczb przekonwertowanych e +! ponieważ po prostu CStr(7.7685099559e+11)zostanie wyświetlony jako „7.7685099559e + 11” nie zgodnie z oczekiwaniami: „776850995590” Więc raczej powiem, że moja odpowiedź będzie bardziej ogólna.

Pozdrawiam, M

Mahhdy
źródło
0

wprowadź opis obrazu tutaj

    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 - Konwertuj liczby na tekst za pomocą VBA

Gajendra Santosh
źródło