Uno strano comportamento.   (09/02/03)

Segnalo un caso a cui non trovo risposta. Usando un "CommandButton" preso da "Strumenti di Controllo" alias "Casella degli Strumenti" (e quindi un oggetto ActiveX), e sfruttando il suo evento Click per eseguire istruzioni, ho notato che alcune istruzioni vengono eseguite in maniera impropria. Le indicazioni che seguono hanno due precisi scopi:

  • primo: segnalare ad altri questo comportamento, ed eventualmente come aggirare il fatto.

  • secondo: se qualcuno conosce il perchè del comportamento e mi vuole cortesemente illuminare.

Ma veniamo al fatto: Copiare un range di dati da un foglio in un altro foglio. Operazione eseguibile in molti modi e comunque necessità abbastanza diffusa nei nostri lavori. Altra necessità richiesta all'operazione, trovare la prima riga libera sul foglio destinazione, dove incollare i dati copiati. Quindi prepariamo le nostre istruzioni e le assegniamo ad un pulsante che risiede sul foglio di partenza. Queste le istruzioni e relativi commenti:

Set Zona = Worksheets(1).Range("tuazona")  'si assegna alla variabile Zona un range di celle del foglio1 al quale range è stato assegnato il nome "tuazona, nell'esempio il range A2:B20.

Worksheets(2).Select 'si seleziona il foglio di destinazione (foglio 2)

'sotto: si inizia un ciclo di ricerca, a partire dalla riga 2 del foglio 2, cercando la prima riga con l'istruzione "While Cells(iRow, 1).Value <> "" "che vuol dire: fino a che non trovi una riga (iRow), nella colonna A (, 1) con la cella vuota, passi alla riga successiva (iRow + 1) quando la trovi, esci dal ciclo (Wend)

Dim  iRow As Integer
iRow = 2
While Cells(iRow, 1).Value <> ""
iRow = iRow + 1
Wend
'trovata la riga con la cella vuota, incollo i dati contenuti in Zona
Zona.Copy Cells(iRow, 1)

E qui avviene lo strano comportamento: inserendo l'istruzione nell'evento Click di un CommandButton posto sul foglio1, i dati presenti in "tuazona", anzichè venire copiati nella prima riga libera, colonna A, del foglio2, vengono incollati nella colonna A ma del foglio1, in coda ai dati presenti. Eppure le istruzioni vengono seguite: se sospendiamo le istruzioni del ciclo di ricerca, vediamo che il foglio 2 viene regolarmente selezionato. Ed è qui, sul foglio 2 che dovrebbe avvenire la ricerca della prima riga libera. Invece  la routine seleziona il foglio2 e poi incolla sul foglio1 (dove risiede il Commandbutton) eseguendo lì il ciclo di ricerca.

Che la routine funzioni, non c'è dubbio: basta provare in questi altri modi:

  • Assegnare le istruzioni ad una macro, ed associare la macro ad un pulsante creato con gli strumenti Disegno/Rettangolo o addirittura allo stesso evento Click del CommandButton, richiamando però la macro e non inserendo direttamente ivi le istruzioni.

  • Usare una Userform da richiamare con un Commandbutton o pulsante messo sul foglio 1, ed assegnare le istruzioni ad un Commandbutton posto sulla stessa Userform (evento Click).

  • Assegnare le istruzioni all'evento Click di un Commandbutton, ma posto sul foglio 2, cioè lo stesso della destinazione.

Sotto: l'immagine del foglio1 con i pulsanti:

Sotto: l'immagine del foglio 2 con l'incollaggio eseguito perfettamente usando uno qualsiasi dei tre pulsanti tranne il pulsante "Archivia" sul foglio1, oppure usando il pulsante "Archivia" ma sul foglio 2:

Sotto: l'immagine del Foglio 1 e cosa avviene se si usa il pulsante "Archivia" con le istruzioni poste nell'evento Click: i dati sono incollati al di sotto dei dati di partenza:

Nota: le istruzioni impiegate copiano tutto: dati e formati, compreso i bordi e il colore celle.

 

allego file d'esempio da scaricare e utilizzare :  EsempioCB.xls     20 Kb

 

LE VOSTRE   RISPOSTE


prelevato sul sito http://ennius.interfree.it