Traversare le `Cells` in un` Range`

Versione breve della domanda :

Il codice qui

Dim rng As Range Set rng = Selection Set rng = rng.Columns(1) For Each cl In rng cl.Select ' <-- Break #2 

mi dà questa nella window immediata quando la selezione è A1:B37

 ? rng.address(External:=True) [Book2]Sheet1!$A$1:$A$37 ? cl.Address(External:=True) [Book2]Sheet1!$A$1:$A$37 

Chiunque può aiutarmi a capire perché cl -> A1:A37 invece di cl -> A1 ? Ricordo che immagino di riscrivere il codice per get i risultati previsti. Ma vorrei sapere qual è il problema e probabilmente imparare qualcosa di nuovo. Questa è la questione.


Versione lunga della domanda (come originariamente pubblicato) :

Ho una subroutine, che funziona sulla rng selezionata (rettangular). Qui di seguito è riportto il codice di pertinenza. Si ncols seconda del numero di ncols di colonne di rng .

Quando ncols=1 , loop attraverso each cella cl in rng , selezionando cl e eseguendo alcune azioni. Quando la selezione di partenza è A1:A37 , questo funziona correttamente, come mostrato dall'output nella window immediata dopo aver inserito il ciclo in Break # 1 (vedi codice sotto)

 ? rng.address(External:=True) [Book2]Sheet1!$A$1:$A$37 ? cl.Address(External:=True) [Book2]Sheet1!$A$1 

Quando ncols<>1 , voglio passare attraverso each cella cl nella prima colonna di rng , facendo lo stesso come prima. Ora, quando la selezione di partenza è A1:B37 , questo non funziona, come mostra l'output nella window immediata di Break # 2

 ? rng.address(External:=True) [Book2]Sheet1!$A$1:$A$37 ? cl.Address(External:=True) [Book2]Sheet1!$A$1:$A$37 

Chiunque può aiutarmi a capire perché qui cl -> A1:A37 invece di cl -> A1 (come in Break # 1 )? Ricordo che immagino di riscrivere il codice per get i risultati previsti. Ma vorrei sapere qual è il problema e probabilmente imparare qualcosa di nuovo. Questa è la questione.

 Dim rng As Range Set rng = Selection Dim ncols As Long ncols = rng.Columns.Count Dim cl As Range ' 1- If only one column is selected, ... If (ncols = 1) Then For Each cl In rng cl.Select ' <-- Break #1 ... Next cl ' 2- If more than one column is selected, ... Else Set rng = rng.Columns(1) For Each cl In rng cl.Select ' <-- Break #2 Dim rng2 As Range Set rng2 = Range(cl, cl.Offset(0, ncols - 1)) rng2.Select ... Next cl End If 

Solutions Collecting From Web of "Traversare le `Cells` in un` Range`"

Non ho ancora avuto la possibilità di testare il tuo codice, ma potresti semplicemente soffrire di una mancanza di spiegazione: cl è un'intervallo, quindi è una Column e una Row un'area e qualsiasi altro tipo di object di tipo gamma. È ansible utilizzare un iteratore di gamma come cl : For each cl in Rng.Rows o ...in rng.Columns , o in ...rng.Cells , ecc.

In altre parole, mentre si può aspettare che il cl sia una gamma di celle , questo non può essere il caso a less che non lo rendi esplicito, come:

 For each cl in rng.Cells 

O, poiché la definisci come una colonna, questo sarebbe equivalente:

 For Each cl in rng.Rows 

( rng , cl rappresenta una gamma di row in quel rng , ma poiché è una singola gamma di colonne, each "row" è anche una singola cella).

Il tuo codice può essere accuratamente semplificato:

 Sub f() Dim rng As Range Dim cl As Range Dim rng2 As Range Set rng = Range(Selection.Address).Resize(, 1) ncols = Range(Selection.Address).Columns.Count For Each cl In rng.Cells cl.Select ' <-- Break #2 If nCols > 1 Then Set rng2 = Range(cl, cl.Offset(0, ncols - 1)) rng2.Select '... End If Next cl End Sub