2016-05-26 5 views
1

Was ich beabsichtige zu machen, ist ein Makro, das ein Streudiagramm basierend auf zwei Datenspalten erstellt, die der Benutzer auswählt. Ich muss irgendwie bekommen, was die zweite Spalte ausgewählt hat, damit ich den richtigen Titel verwenden kann.Zurück Spaltennummer der letzten Spalte eines Bereichs mit Lücken

ich folgendes bisher versucht habe:

myrng.Columns(myrng.Columns.Count).Column 

dies gibt nur 1, da es Lücken im Bereich sind.

Gibt es eine andere Methode, die mit einem Bereich funktioniert, der Lücken enthält, oder gibt es vielleicht eine andere Möglichkeit, die Daten grafisch darzustellen und dann zu finden, was die zweite ausgewählte Spalte ist?

+0

Zeichnen Sie im Visual Basic-Editor ein Makro von dem auf, was Sie manuell tun. Wenn Sie fertig sind, drücken Sie auf Aufnahme beenden, gehen Sie zu Makros und bearbeiten Sie das soeben aufgenommene Makro. Dort können Sie den entsprechenden Code sehen, um das zu tun, was Sie gerade manuell getan haben, und dann können Sie erweitern, wie Sie es für richtig halten. – dinotom

+0

Ich bin mir der Rekordfunktion in Excel bewusst. Es gibt keine Möglichkeit für mich zu sehen, wie man jedoch eine Spaltennummer zurückgibt. – Corus

+0

'lastCol = ws.Cells (1, ws.Columns.count) .Ende (xlToLeft) .Column'? – findwindow

Antwort

1

Wenn r einige definierte Bereich ist dann an seine Grenzen sind:

nLastRow = r.Rows.Count + r.Row - 1 
MsgBox ("last row " & nLastRow) 

nLastColumn = r.Columns.Count + r.Column - 1 
MsgBox ("last column " & nLastColumn) 

nFirstRow = r.Row 
MsgBox ("first row " & nFirstRow) 

nFirstColumn = r.Column 
MsgBox ("first column " & nFirstColumn) 

numrow = r.Rows.Count 
MsgBox ("number of rows " & numrow) 

numcol = r.Columns.Count 
MsgBox ("number of columns " & numcol) 

EDIT # 1:

Dieses auf einem beliebigen Bereich arbeiten , kompakt oder disjunkt. Es wird sogar funktionieren, wenn die Reichweite völlig leer ist. Das Sub wird jedoch sehr langsam sein, wenn der Bereich viele Zellen hat.:

Sub SlowAgony() 
    Dim myrange As Range, r As Range, nLastColumn As Long 
    Set myrange = Union(Range("C1:C100"), Range("G1:G100")) 

    nLastColumn = 0 
    For Each r In myrange 
     If r.Column > nLastColumn Then nLastColumn = r.Column 
    Next r 

    MsgBox nLastColumn 
End Sub 

EDIT # 2:

Auf diese Weise ist schneller:

Sub ytrewq() 
    Dim r As Range, addy As String, ary 
    Dim nLastColumn As Long, rr As Range 
    Set r = Selection 
    addy = r.Address(0, 0) 

    If InStr(1, addy, ",") = 0 Then 
     nLastColumn = r.Columns.Count + r.Column - 1 
    Else 
     ary = Split(addy, ",") 
     nLastColumn = 0 
     For Each a In ary 
      Set rr = Range(a) 
      If rr.Columns.Count + rr.Column - 1 > nLastColumn Then 
       nLastColumn = rr.Columns.Count + rr.Column - 1 
      End If 
     Next a 
    End If 

    MsgBox nLastColumn 
End Sub 

Die letzte Routine untersucht die kompakten Komponenten eines disjunkten Bereich.

+0

Dies funktioniert für eine Reihe ohne Lücken, aber funktioniert nicht für meine Palette, da es Lücken hat. Dh, ich wähle Spalten 3 und 7, und es gibt keine Spalte 7. – Corus

+0

@Corus Sie haben Recht .............. Ich werde diese Antwort zurückziehen ....... –

+0

@Corus Siehe meine ** EDIT # 1: ** –

Verwandte Themen