Excel VBA'da bir tamsayıyı dizeye nasıl dönüştürebilirim?


Yanıtlar:


262

CStr(45) tek ihtiyacınız olan şey (String'i Dönüştür işlevi)


1
CStr(45), kesin olmak.
Kouichi C. Nakamura

bu, e + dönüştürülmüş sayılar için çalışmaz! Yani 7.7685099559e + 11, beklendiği gibi değil "7.7685099559e + 11" olarak gösterilecek: "776850995590" Bu daha genel bir şey olacağını söylemek istiyorum:CStr(CDbl(***))
Mahhdy

Sorunun ihtiyaçlarına cevap verebilir, ancak bazı durumlarda eksik ve yetersizdir. Genellikle (örneğin dosya adlandırma amacıyla) sıfır önekli sayılar oluşturmak isteyebilirsiniz, öyle 7olur 007. Ondalıkların sayısını belirtmek veya binlik ayırıcı eklemek de isteyebilirsiniz. Bu ayrıntılar sizin için önemliyse: excelfunctions.net/vba-format-function.html
cartbeforehorse

97

CStr () işlevini deneyin

Dim myVal as String;
Dim myNum as Integer;

myVal = "My number is:"
myVal = myVal & CStr(myNum);

51

Çoğu zaman, "dönüştürmek" gerekmez; VBA, sizin için güvenli örtülü tip dönüştürme yapacak olmadan gibi konverter kullanımı CStr.

Aşağıdaki kod herhangi bir sorun olmadan çalışır, çünkü değişken Type String'dir ve örtük tip dönüşümü sizin için otomatik olarak yapılır!

Dim myVal As String
Dim myNum As Integer

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

Sonuç:

"Numaram: 0"

Bu kadar süslü olmanıza bile gerek yok, bu da işe yarıyor:

Dim myString as String
myString = 77

"77"

Dönüştürmeniz gereken tek zaman , Type değişkeninin belirsiz (ör. Type Variant veya bir Cell's Value( Variant)) olduğu zamandır.

O zaman bile, CStrbaşka bir String değişkeni veya sabiti ile birleşiyorsanız işlevi kullanmak zorunda kalmazsınız . Bunun gibi:

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

"Favori numaram 7"

Gerçekten, sadece nadir gerçekten, ne zaman bir varyant veya Hücre değerine, bir tamsayı değeri saklamak istediğinizde böyledir değil de başka bir dizeyle bileşik (oldukça nadir yan uygulamalarda olduğu gibi eklemeliyim):

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"


2
Doğru olduğu için bu cevabın neden daha fazla oyu olduğunu anlamıyorum. Tip dönüşümünün her zaman yapılmadığını, kullanımdaki operatöre bağlı olduğunu belirtmek gerekir . Örneğin + işlemi her zaman bir dizenin tamsayısını genişletmez.
Mark Ch

1
@MarkCh Bunun eski olduğunu biliyorum, ama ... belki de VBA'nın iğrenç örtülü dönüşümleri ve varsayılan üye çağrıları çok fazla VBA kodunu zayıf, şaşırtıcı ve hataya eğilimli yapan şeydir? Örtülü dönüşümler, örtük erişilebilirlik, örtük varsayılan üye erişimi, örtük 1 tabanlı diziler Option Base 1, örtük yazma Def[Type](EVIL! Boy) ile örtülü olmasaydı, SO hakkında SO kadar çok sayıda soru olmayacaktı ... anlıyorsunuz - VBA'daki tek iyi örtük şey, açıkça Callgeçersiz kılan örtük çağrı sözdizimidir .
Mathieu Guindon

7

Benim durumumda, CString işlevi bulunamadı. Ancak değere boş bir dize eklemek de işe yarar.

Dim Test As Integer, Test2 As Variant
Test = 10
Test2 = Test & ""
//Test2 is now "10" not 10

2
Kimse hakkında konuşulmadı CString, bu bir VB.NET işlevi. Bir dize yapmak için boş bir dize hazır bilgisini birleştirmek oldukça topal bir dönüşüm yöntemidir. CStrAçık tür dönüşümler için kullanın - bu, örtük tür dönüşümdür ve bu kodu okuyan herkesin kaşlarını yükseltir. Üzgünüm, bu cevabı gönderildikten sonra çok geç buldum, keşke çok daha önce reddedebilirdim.
Mathieu Guindon

2

Çektiğiniz dize E01 gibi onaltılık bir sayı olursa, CStr işlevini kullansanız ve ilk önce bir String değişkeni türünde bıraksanız bile Excel 0 olarak çevirir. Bu sorunun bir yolu, değerin başına 'eklemektir.

Örneğin, değerleri bir Word tablosundan çekip Excel'e getirirken:

strWr = "'" & WorksheetFunction.Clean(.cell(iRow, iCol).Range.Text)

2

Değişkeni bildirmeden en kısa yol Tip İpuçları'dır :

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

Bu derlenmeyecektir Option Explicit. Tipleri olmayacak Variantama StringveInteger


0

Bunu yapmanın başka bir yolu, sayısal değerin iki ayrıştırılmış bölümünü birbirine eklemektir:

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

Bu konuda daha iyi bir başarı buldum, CStr()çünkü CStr()deneyimimdeki varyantlardan gelen ondalık sayıları dönüştürmüyor gibi görünüyor.


0

Geçerli bir tamsayı değeriniz varsa ve gereksiniminiz değerleri karşılaştırmaksa, aşağıda görüldüğü gibi karşılaştırmaya devam edebilirsiniz.

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

0

Kabul edilen cevap küçük sayılar için iyidir, en önemlisi excel sayfalarından veri alırken. daha büyük sayılar otomatik olarak bilimsel sayılara dönüştürülecektir, örn. e + 10.
Bence bu size daha genel bir cevap verecektir. Herhangi bir çöküşü olup olmadığını kontrol etmedim.

CStr(CDbl(#yourNumber#))

Bu, e + dönüştürülmüş sayılar için çalışacaktır! sadece CStr(7.7685099559e+11)beklendiği gibi değil "7.7685099559e + 11" olarak gösterilecektir: "776850995590" Bu yüzden cevabım daha genel bir sonuç olacağını söylemek istiyorum.

Saygılarımızla, M


0

resim açıklamasını buraya girin

    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

Yanıt: MrExcel.com - VBA ile sayıları metne dönüştürün

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.