2016-03-29 20 views
-1

VBA'da, bir diziyi bir türden diğerine nasıl dönüştürebilirim ?, benim durumumda "değişken" türüne "String" dizisini dönüştürmek istiyorum çünkü gereken bir işlev parametrem var Bu tür bir dizi. Burada VBA Diziyi dönüştür Tür


için "string" ByRef arr() As String ama "varyant" türünde bir dizi döndürür diğer fonksiyonlara sahip i parametre türünü değiştirebilirsiniz biliyoruz

Sub test_highlighfind() 

    Dim Rng As Range: Set Rng = ThisDocument.Range.Paragraphs(6).Range 

    Dim arr() As String: arr = Split(Rng.Text) 

    Call highlightWordsUsingFind(arr, ThisDocument, 7) 

End Sub 

Sub highlightWordsUsingFind(ByRef arr() As Variant, ByRef doc As Document, _ 
          Optional ByVal HighlightColor As Integer = 6) 

    Dim i As Long, SearchRange As Range 

    Set SearchRange = doc.Range 

    With SearchRange.Find 
     .Format = True 
     .MatchCase = False 
     .MatchWholeWord = True 
     .MatchWildcards = False 
     .MatchSoundsLike = False 
     .MatchAllWordForms = False 
     .Forward = True 
     .Wrap = wdFindContinue 
     .ClearFormatting 

     For i = LBound(arr) To UBound(arr) 
      .Text = arr(i) 
      .Execute 'Execute// Runs the find operation. Returns True if the find operation is successful 
      SearchRange.HighlightColorIndex = HighlightColor 
     Next 
    End With 
End Sub 

bir örnek koddur ve

cevap

2

'un üstündeki işleve çıkışa ihtiyacım var highlightWordsUsingFind alt yazısını yazdığınızdan beri, en kolay yol parametreyi Variant olarak zaten bana göre değiştirmektir GSerg tarafından belirtilmiştir. Parametrenin aslında IsArray işlevine sahip bir dizi olmasını sağlamak iyi bir fikir olabilir. Here, diğer bazı dönüşüm örnekleridir.

Function StringToVariantArray(ByRef arr() As String) As Variant() 
    Dim index As Integer 
    Dim result() As Variant 
    Redim result(LBound(arr) To UBound(arr)) 
    For index = LBound(arr) To UBound(arr) 
     result(index) = arr(index) 
    Next 
    StringToVariantArray = result 
End Function 

Sub test_highlighfind() 
    Dim Rng As Range 
    Dim varr() As Variant 

    Set Rng = ThisDocument.Range.Paragraphs(6).Range 
    varr = StringToVariantArray(Split(Rng.Text)) 

    Call highlightWordsUsingFind(varr, ThisDocument, 7) 
End Sub  
+0

çok teşekkürler, bu fikrim vardı ama herhangi bir döngü olmadan bir çözüm olduğunu ümit ettim .. tekrar tekrar teşekkürler ve umarım sizden yeni şeyler öğrenirim –

3

sizin ifadede parantez kaldırın:

başka yolu ise yeni Varyant dizi oluşturmaktır.

Sub highlightWordsUsingFind(ByRef arr As Variant, ...) 

Sonra doğrudan arr() geçebilir. Özgün diziye başvuracak bir içine sarılacaktır (bu nedenle kopyalama gerçekleşmeyecektir).

+0

bilgi için teşekkürler –