Condividi tramite

Excel VB ciclo For Next finito ciclo riparti dalla riga successiva

Anonimo
2016-09-11T10:24:49+00:00

Buon Giorno a tutti

grazie alla community ho assemblato un codice  che tramite UserForm mi permette di inserire in una tabella una sequenza di dati

l'UserForm contiene due ListBox  e due CommandButton (Salva Dato , Esci)

La ListBox1 carica le Categorie  ( 6 categorie )

La ListBox2 carica  i Componenti delle Categorie Relative

il ciclo (6 Step ) partendo dalla Riga 1 inserisce i dati  in sequenza partendo da A1 , B1 , C1 , D1 , E1 , F1

esaurito il Ciclo  ..... DOVREBBE RIPARTIRE  da  A2 , B2 , C2 , D2 , E2 , F2

Il codice che incollo sotto fa' bene la prima riga ....ma poi riparte sempre da A1 .... (sovrascrive i dati ! )

NON RIESCO  a inserire l'istruzione ....FINITO il Ciclo RIPARTI  dalla Riga successiva ..... !!!!

questo e' il codice

Private Sub CommandButton2_Click()   

Dim p As String

Dim posiz As String

Dim i As Long

Dim lCol As Long

  With Sheets("Foglio2")

  For lCol = 1 To 6

     If Sheets("Foglio2").Cells(i, 1) = Empty Then

      i = 1

  p = posiz

  posiz = i + 1

   .Cells(i, p + 1).Value = ListBox2.Text

   End If

  Next

  End With

End Sub

Ringrazio chiunque mi da' un'indicazione (suggerimento ....)    Grazie  Claudio P

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2016-09-12T07:26:15+00:00

Visto che è per studio, meglio se tu provi a ragionare sul codice qui sotto anziché avere la *pappa pronta*

    Dim lng As Long

    Dim lRiga As Long

    Dim lCol As Long

    '....................

    'codice che mette un riferimento al foglio omesso

    'nell'esempio utilizzo NomeFoglio

    '.....................

    'trovo l'ultima riga della colonna A con un valore

    'e aggiungo 1 per passare alla prima vuota

    lRiga = NomeFoglio("A" & Rows.Count).End(xlUp) + Row + 1

    With Listbox1

        'passo alla variabile il numero delle colonne

        'dlla ListBox

        lCol = .ColumnCount

        'passo alle colonne del foglio i valori delle

        'colonne della ListBox (ti ricordo che la

        'prima colonna della ListBox è colonna 0

        'mentre quella del foglio è colonna 1

        For lng = 0 To lCol

            NomeFoglio.Cells(lRiga, lng + 1).Value = .List(.ListIndex, lng)

        Next

    End With

    'ecc.

Il codice *presume* che tu abbia selezionato nella Listbox la riga da copiare nel foglio.

Se invece vuoi portare nel foglio tutte le righe della Listbox, qui dopo averla caricata la ciclo inserendo tutti i suoi valori in Foglio2 (codice sempre a scopo didattico):

Dim lng1 As Long

    Dim lng2 As Long

    Dim lRiga As Long

    Dim lRighe As Long

    Dim lCol As Long

lRiga = Foglio2.Range("A" & Rows.Count).End(xlUp).Row + 1

    With ListBox1

        lCol = .ColumnCount

        lRighe = .ListCount

        For lng1 = 0 To lRighe - 1

            For lng2 = 0 To lCol - 1

                Foglio2.Cells(lRiga, lng2 + 1).Value = .List(lng1, lng2)

            Next

            lRiga = lRiga + 1

        Next

    End With

    'ecc.

    End Sub

La risposta è stata utile?

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2016-09-11T12:22:30+00:00

Ciao Claudio,

grazie alla community ho assemblato un codice  che tramite UserForm mi permette di inserire in una tabella una sequenza di dati

l'UserForm contiene due ListBox  e due CommandButton (Salva Dato , Esci)

La ListBox1 carica le Categorie  ( 6 categorie )

La ListBox2 carica  i Componenti delle Categorie Relative

il ciclo (6 Step ) partendo dalla Riga 1 inserisce i dati  in sequenza partendo da A1 , B1 , C1 , D1 , E1 , F1

esaurito il Ciclo  ..... DOVREBBE RIPARTIRE  da  A2 , B2 , C2 , D2 , E2 , F2

Il codice che incollo sotto fa' bene la prima riga ....ma poi riparte sempre da A1 .... (sovrascrive i dati ! )

NON RIESCO  a inserire l'istruzione ....FINITO il Ciclo RIPARTI  dalla Riga successiva ..... !!!!

questo e' il codice

Private Sub CommandButton2_Click()   

Dim p As String

Dim posiz As String

Dim i As Long

Dim lCol As Long

  With Sheets("Foglio2")

  For lCol = 1 To 6

     If Sheets("Foglio2").Cells(i, 1) = Empty Then

      i = 1

  p = posiz

  posiz = i + 1

   .Cells(i, p + 1).Value = ListBox2.Text

   End If

  Next

  End With

End Sub

Vedo vari problemi intrinseci con il tuo codice e, come scritto, non credo che esso possa mai funzionare oltre la prima riga del codice senza bloccarsi. Purtroppo, a me non risulta evidente ciò che tu stia cercando di raggiungere e, quindi, non sono in grado di suggerire un codice funzionante. Tuttavia, ho il sospetto che, tra le altre cose, si richieda un ciclo nidificato.

Come esempio banale, considera il seguente codice che riempie dei numeri crescendo nelle celle di colonne A:G per le prime 10 righe vuote del Foglio2:

'=========>>

Option Explicit

'--------->>

Public Sub Tester()

    Dim WB As Workbook

    Dim SH As Worksheet

    Dim Rng As Range

    Dim LRow As Long

    Dim i As Long, j As Long, k As Long

    Const sFoglio As String = "Foglio2"              '<<=== Modifica

    Const numeroColonne As Long = 6 '<<=== Modifica

    Const numRighe As Long = 10 '<<=== Modifica

    Set WB = ThisWorkbook

    Set SH = WB.Sheets(sFoglio)

    With SH

        LRow = LastRow(SH, .Columns("A:A"))

        Set Rng = .Range("A" & LRow + 1)

    End With

    For i = 1 To numRighe

        For j = 1 To numeroColonne

            k = k + 1

            Rng.Cells(i, j).Value = k

        Next j

    Next i

End Sub

'--------->>

Public Function LastRow(SH As Worksheet, _

                        Optional Rng As Range, _

                        Optional minRow As Long = 1)

    If Rng Is Nothing Then

        Set Rng = SH.Cells

    End If

    On Error Resume Next

    LastRow = Rng.Find(What:="*", _

                       after:=Rng.Cells(1), _

                       Lookat:=xlPart, _

                       LookIn:=xlFormulas, _

                       SearchOrder:=xlByRows, _

                       SearchDirection:=xlPrevious, _

                       MatchCase:=False).Row

    On Error GoTo 0

    If LastRow < minRow Then

        LastRow = minRow

    End If

End Function

'<<=========

Ponendo che la prima riga libera sia  la riga3, eseguendo questo codice si otterrebbe qualcosa del genere:

Per aiutarti ulteriormente, ti chiederei gentilmente di caricare un file di esempio mostrando chiaramente i risultati desiderati e il modo di riempire gli oggetti Listbox.

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento

12 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-09-12T07:51:55+00:00

    Grande  Mauro

    Buon giorno ..... questo e' proprio il modo corretto per apprendere  ......  io sto seguendo le tracce (esercizi ...  )del testo  " A Scuola con VB 2010  "  che ho trovato in rete ..... che  e' piu' indirizzato verso  la grafica e  contiene pochi esempi specifici per lavori con Excel .

    Sto cercando testi con  esercizi di base VB  per Excel  

    Adesso  Lavoro sulla tua traccia

    Grazie                                 Claudio P

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-09-11T17:41:28+00:00

    Ciao Norman

    ecco il Link

    https://www.dropbox.com/s/leh84xr5owjynje/Due%20ListBox%20settembre%202016.xlsm?dl=0

    il Foglio1 contiene i database delle categorie 

    riga 1 contiene le intestazioni delle categorie (Destinazione ,Tour Operator,Trasportatore ....etc )

    Dalla riga 2 in poi ci sono gli elenchi delle voci selezionabili

    Nel Foglio2  c'e'  il Pulsante2  che Apre l'UserForm

    Questo e'  il Foglio di Destinazione dei dati

    La sequenza dovrebbe essere :

    1

    LstBx1  Click  Destinazione

    LstBx2 Click   Abano Terme

    Salva Tutti i dati ( viene copiato in A1 )

    2

    LstBx1  Click  Tour Operator

    LstBx2 Click   Eden Viaggi

    Salva Tutti i dati ( viene copiato in B1 )

    3

    LstBx1  Click  Trasportatore

    LstBx2 Click   Apa Tour

    Salva Tutti i dati ( viene copiato in C1 )    ...... fino  alla categoria 6  

    Compilata la riga 1  e  finito il Ciclo    For   lCol  1 To 6

    Dovrebbe ripartire in modo che il dato successivo  venga copiato  in  A2 , poi B2 , C2   etc ...

    .....forse  e' questa la parte che manca

    Dim LRow As Long

    LRow = LastRow(SH, .Columns("A:A"))

            Set Rng = .Range("A" & LRow + 1)

    ....intanto  ci ragiono e faccio delle prove

    Grazie  per la tua  pazienza

                                 Ciao  Buona serata    Claudio P

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-09-11T17:12:06+00:00

    Buona sera Norman

    adesso vedo di caricare su DropBox  il file , poi postero' il Link

    ....il codice  non si blocca  ...... solo che riparte sempre dalla riga 1  (A1,B1,C1 ..... )

    La parte che riguarda il popolamento delle ListBox  funziona

    la ListBox1  carica le categorie ( 6 categorie diverse ) , con click su una delle categorie in ListBox1 , nella ListBox2 viene caricato l'elenco della sottocategoria .

    evidenziando (click ) in ListBox2 una delle voci , questa viene copiata nella cella del foglio 2  tramite cmdbttn (salva dato)

    Ho imparato ....decentemente .... a popolare le  ListBox ..... non riesco ancora a utilizzare in maniera corretta  le istruzioni  per il posizionamento del dato nella cella voluta e nella riga giusta

    Considera che sono fermo sul Ciclo  For .... Next  da  una decina di giorni

    .......... E'  un esercizio .... per  imparare    GRAZIE   Come  sempre

    La risposta è stata utile?

    0 commenti Nessun commento