Sviluppare funzionalita su Microsoft Office con VBA Saltare un ciclo a determinate condizioni

LoginRegistrati
Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)
  • Autore
    Articoli
  • #28140 Risposta

    Duccio

      Salve a tutti,

      Sono alle prime armi, quindi premetto che potrei fare domande stupide. Sono riuscito comunque a creare una macro che mi copia una certa tabella (aggiustata opportunamente con riferimenti assoluti e relativi) "i" volte. A condizione che il copia avvenga qualche riga sotto, ottengo determinate informazioni per "i" imprese, senza il bisogno di dover copi-incollare la tabella tutte le volte. Questa tabella ha sia formule che fanno riferimento a un altro foglio sia formule che funzionano sul foglio stesso. Il codice è questo e funziona bene:

      Sub Macro1Prova()
      '
      ' Macro1Prova Macro
      '

      '
      Dim i As Integer

      For i = 1 To 37
      Range("H5:M24").Select
      Selection.Copy
      Range("N11").Select
      ActiveCell.Offset(6 * i, 0).Select
      ActiveSheet.Paste
      Application.CutCopyMode = False

      Selection.Cut Destination:=Range(Cells(25 * i + 5, 8), Cells(25 * i + 24, 13))

      Range(Cells(25 * i + 2, 1), Cells(25 * i + 3, 1)).Select
      Selection.Copy
      Range("H2").Select
      ActiveCell.Offset(25 * i, 0).Select
      ActiveSheet.Paste

      Next

      End Sub

      Il problema è che voglio far sì che venga saltato un certo ciclo a determinate condizioni. In particolare, se i valori in una casella, sono 0, 685, 175 o 270, per varie questioni su cui non mi soffermo. Ho così modificato la macro, in blu il testo aggiunto, che però non funziona. Dice che ho messo un next senza un for.

      Sub Macro1Prova()
      '
      ' Macro1Prova Macro
      '

      '
      Dim i As Integer

      For i = 1 To 37
      Range("H5:M24").Select
      Selection.Copy
      Range("N11").Select
      ActiveCell.Offset(6 * i, 0).Select
      ActiveSheet.Paste
      Application.CutCopyMode = False

      If Range(Cells(25 * i + 7, 9)).Value = 0 Or Range(Cells(25 * i + 7, 9)).Value = 683 Or Range(Cells(25 * i + 7, 9)).Value = 175 Or Range(Cells(25 * i + 7, 9)).Value = 270 Then
      GoTo Continue
      Continue:
      Next i

      Else

      Selection.Cut Destination:=Range(Cells(25 * i + 5, 8), Cells(25 * i + 24, 13))

      Range(Cells(25 * i + 2, 1), Cells(25 * i + 3, 1)).Select
      Selection.Copy
      Range("H2").Select
      ActiveCell.Offset(25 * i, 0).Select
      ActiveSheet.Paste

      End If

      Next

      End Sub

      Cosa sto sbagliando? Grazie a tutti dell'attenzione

      #28142 Risposta

      GiuseppeMN
      Partecipante
        9 pts

        Salve, @Duccio;
        credo si possa eliminare

        Next i
        

        ma senza un file d'esempio, senza Dati sensibili, con il quale poter condurre dei Test significativi mi è impossibile proporre una soluzione più esaustiva.

        Quello che mi permetto di consigliarte è di ridurre i "Select"; alcuni non servono e complicano il Codice VBA

        Giuseppe

        #28145 Risposta

        Duccio

          Capisco. Aggiornare il file per togliere dati sensibili mi richiederebbe davvero troppo tempo. Mettiamola così allora, tu come scriveresti di fargli saltare un ciclo se incontra un certo valore? In generale, intendo, in un qualsiasi ciclo for next

          #28146 Risposta
          patel
          patel
          Moderatore
            40 pts

            La tua macro è scritta talmente male da risultare poco comprensibile, mi associo alla richiesta di Giuseppe, basta allegare un file di esempio con dati fittizi ed il risultato desiderato.

            Ad occhio e senza capire cosa vuoi fare io proporrei una cosa del genere

                Sub Macro1Prova()
            
                For i = 1 To 37
                  If Range(Cells(25 * i + 7, 9)).Value = 0 Or Range(Cells(25 * i + 7, 9)).Value = 683 Or Range(Cells(25 * i + 7, 9)).Value = 175 Or Range(Cells(25 * i + 7, 9)).Value = 270 Then
                    Range("H5:M24").Copy Range("N11").Offset(6 * i, 0)
                  Else
                    Range(Cells(25 * i + 2, 1), Cells(25 * i + 3, 1)).Copy Range("H2").Offset(25 * i, 0).Select
                  End If
                Next
                End Sub
            
          LoginRegistrati
          Stai vedendo 4 articoli - dal 1 a 4 (di 4 totali)
          Rispondi a: Saltare un ciclo a determinate condizioni
          Gli allegati sono permessi solo ad utenti REGISTRATI
          Le tue informazioni:



          vecchio frac - 2750 risposte

          albatros54
          albatros54 - 1009 risposte

          patel
          patel - 976 risposte

          Marius44
          Marius44 - 848 risposte

          Luca73
          Luca73 - 720 risposte