2016-01-21 27 views
7

Hücrede bir dizim var, "İstemci Ref: F123456PassPlus" yazdığını varsayalım. Dize, sayılardan önce bir harf içermiyor olabilir, sayılarda bir sembol var ve harf ve sayılar arasında bir boşluk olabilir. Sadece sayıları değişken olarak almam gerekiyor. Bunu yapmak için kodum var, ancak dize boyunca ne zaman döngü yapılacağını bilmiyor. Bir sayı veya sembolden başka bir şey olduğunda durmalı, ancak yerine devam etmelidir. tanımları yok orada herhangi değişken harfler daha önce tanımlanmıştırExcel VBA, bir harf bulunana kadar bir sayı dizisiyle döngü

IsNumber = 1 
ref = "" 
If branch = "" Then 
    e = b 
Else 
    e = b + 1 
End If 
f = 1 
While IsNumber = 1 
    For intpos = 1 To 15 
     ref = Mid(x, e, f) 
     f = f + 1 
     Select Case Asc(ref) 
      Case 45 To 57 
       IsNumber = 1 
      Case Else 
       IsNumber = 0 
       Exit For 
     End Select 
    Next 
    IsNumber = 0 
Wend 

e kopyalama işlemini başlatmak ve x dizesini içeren hücredir kodu söyler. Şimdilik, her şey iyi çalışıyor, sayıdan başlıyor ve bunları kopyalar ve daha büyük ve daha büyük bir dizeye dönüştürür, ancak sadece intpos 15'e ulaştığı zaman duracaktır.

+0

Alttan sonlandırmak istediğiniz her yerde, 'Exit Sub' öğesini ekleyin. – BruceWayne

+0

Makroda bir harf olduğunda (ya da tercihen hemen önce) ne zaman olduğunu bilmek için makroya ihtiyacım var, o zaman kodumda 'Exit For' kullanılır. Yazdıklarımla, bunu yapması gerektiğini düşündüm ama görünüşe göre değil. –

+1

Değerleri görmek için Asc (ref) debug.print mi oldunuz? – CPMunich

cevap

3

.

IsNumber = 1 
ref = "" 
If branch = "" Then 
    e = b 
Else 
    e = b + 1 
End If 
f = 1 
While IsNumber = 1 
    For intpos = 1 To 15 
     char = Mid(x, e + intpos, 1) 
     f = f + 1 
     If IsNumeric(char) Then 
      ref = Mid(x, e, f) 
      IsNumber = 1 
     Else 
      IsNumber = 0 
      Exit For 
     End If 
    Next 
    IsNumber = 0 
Wend 
2

Bu kod, eserlerinize bağlı olarak ("12345" üretir. Büyük dizeler veya daha karmaşık ekstraksiyon ihtiyaçları için regex COM nesnesini öğrenmeyi düşünürdüm.

Function ExtractNumber(ByVal text As String) As String 

    ExtractNumber = "" 

    foundnumber = False 

    For e = 1 To Len(text) 
    ref = Mid(text, e, 1) 
     Select Case Asc(ref) 
      Case 45 To 57 'this includes - . and /, if you want only digits, should be 48 to 57 
       foundnumber = True 
       ExtractNumber = ExtractNumber & ref 
      Case Else 
       If foundnumber = True Then Exit For 
     End Select 
    Next 

End Function 
5

var senin bu görevi yerine getirmeye çalışan nasıl yanlış bir şey ama düzenli ifade :-) düşündüren kendimi yardım edemez

Bu örnek A1 bulunan dize olmayan tüm rakamları şerit olacak ve sonucu bir mesaj kutusuna gönderin. kullanılan desen [^0-9]

Sub StripDigits() 
    Dim strPattern As String: strPattern = "[^0-9]" 
    Dim strReplace As String: strReplace = vbnullstring 
    Dim regEx As New RegExp 
    Dim strInput As String 
    Dim Myrange As Range 

    Set Myrange = ActiveSheet.Range("A1") 

    If strPattern <> "" Then 
     strInput = Myrange.Value 
     strReplace = "" 

     With regEx 
      .Global = True 
      .MultiLine = True 
      .IgnoreCase = False 
      .Pattern = strPattern 
     End With 

     If regEx.test(strInput) Then 
      MsgBox (regEx.Replace(strInput, strReplace)) 
     Else 
      MsgBox ("Not matched") 
     End If 
    End If 
End Sub 

Eğer aralıkları check out this post döngü örnekleri de dahil olmak Excel'de regex nasıl kullanılacağı konusunda daha fazla bilgi için bir başvuru için "Microsoft VBScript Düzenli İfadeler 5.5"

eklemek emin olun olduğunu.

Sonuçlar: Ben Asc çek kurtulmak ve sayısal "dizesini" inşa önce geçerken her karakter karşı bir çek ekledi var

enter image description here

+0

Güzel, regex kullanmayı düşünüyordum, ancak Hiçbir şey yazamayacak kadarını bil. İyi düşünmek! – BruceWayne

+0

İyi yaklaşım. 'Vbnullstring’i kullanmak biraz daha verimlidir, o zaman' '' ' – brettdj