2017-09-21 2 views
1

Ich arbeite mit einer Excel-Datei, die die folgenden Werte mit einigen Zellkommentaren enthält. enter image description hereVBA _ Excel Range Kommentare zu Array

Der folgende VB-Code dient zum Kopieren der Werte und Kommentare in ein Array.

Sub commentToArray() 
arrayValues = Range("A1:A6").Value 
arrayComments = Range("A1:A6").Comment.Text 
End Sub 

Das Werte-Array funktioniert einwandfrei, aber das Kommentar-Array füllt eine Fehlermeldung.

enter image description here

Könnten Sie mir bitte helfen, dieses heraus zu sortieren.

Danke, Aneesh

+1

Ich bezweifle, 'Range.Comment.Text' würde auf mehrere Zellen auf einmal arbeiten. – kaza

+0

@bulbus ist richtig. Sie können nicht alle Kommentare in ein Array wie dieses schreiben. Der Grund dafür ist, dass die Auflistung aller Kommentare auf einem Blatt "ActiveSheet.Comments" und nicht ActiveSheet.Range ("A1: A5") ist. Dies liegt daran, dass jedes Mitglied einer Sammlung angesprochen werden kann. Aber wenn eine Zelle keinen Kommentar enthält. Kurz gesagt: Die Sammlung 'ActiveSheet.Cells' wird immer' ActiveSheet.Rows.Count' multipliziert mit 'ActiveSheet.Columns.Count' = 17.179.869.184 Zellen für ein Excel 2007 Blatt (oder höher) sein. Die Sammlung von 'ActiveSheet.Comments' ist nur so groß, wie es Kommentare auf dem Blatt gibt – Ralph

+0

Mögliches Duplikat von [Beschleunigung der Arbeit mit Kommentaren in Excel VBA] (https://stackoverflow.com/questions/31234053/speed-up- working-with-comments-in-excel-vba) Genauer gesagt, die folgende Antwort erklärt besser, was ich versuchte, in den obigen Kommentar zu bekommen: https://Stackoverflow.com/a/31235424/1153513 – Ralph

Antwort

0

Ihr Code haben zwei Fehler:

  1. Sie nicht Comment.Text Verfahren für eine Reihe von mehreren Zellen verwenden können.
  2. Sie können die Comment.Text auf eine Zelle verwenden, die keinen Kommentar enthält.

Dies kann eine Lösung für Sie sein:

Sub commentToArray() 
    Dim arrayValues As Variant 
    Dim ArrayCommnents() As String 
    Dim myRange, commentsRange, mycell As Range 
    Dim i As Integer 

    arrayValues = Range("A1:A6").Value 
    Set myRange = ActiveSheet.Range("A1:A6") 
    Set commentsRange = myRange.Cells.SpecialCells(xlCellTypeComments) 
    arrayLenght = commentsRange.Count 
    ReDim arrayComments(arrayLenght) 

    For Each mycell In commentsRange 
     i = i + 1 
     arrayComments(i) = mycell.Comment.Text 
     Debug.Print (arrayComments(i)) 
    Next mycell 
End Sub 

Erläuterung:

  • Ich benutze myRange var mit dem Bereich für Kommentare zu bewerten. Als nächstes muss ich feststellen, welche Zellen einen Kommentar enthalten, das ist der Zweck von commentsRange var.
  • Ich habe die .SpcialCells() Methode verwendet, um nur Zellen mit Kommentaren zu erhalten.
  • Dann bekomme ich die Länge der commentsRange mit .Count Eigenschaft. Ich bekomme die Anzahl der Zellen, die einen Kommentar enthalten.
  • Redimensionieren Sie das Array der Kommentare erforderlich ist.
  • Die For Each Schleife ist Zelle für Zelle Kommentare im Bereich der Zellen mit Kommentaren zu bekommen. Ein inkrementeller Index i zum Ausführen des Arrays und Sie haben es.