Odpowiedzi:
CStr(45)
to wszystko, czego potrzebujesz (funkcja Convert String)
CStr(CDbl(***))
7
staje 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
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ć CStr
funkcji, 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”
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ę Call
przestarzałe.
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
CString
, co jest funkcją VB.NET. Łączenie pustego literału ciągu w celu utworzenia łańcucha jest dość kiepską metodą konwersji. Używaj CStr
do 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.
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)
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 Variant
ale String
iInteger
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.
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
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
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
CStr(45)
, być precyzyjnym.