Sviluppare funzionalita su Microsoft Office con VBA errore runtime 13 mismatch quando arriva ad una cella vuota

Login Registrati
Stai vedendo 19 articoli - dal 1 a 19 (di 19 totali)
  • Autore
    Articoli
  • #7323 Score: 0 | Risposta

    Raid
    Partecipante
      1 pt

      salve

      avrei bisogno di una mano...

      questa macro mi da un errore dovuto ad un loop che non si ferma quando arriva ad una cella vuota.

      come potrei fare, io ho bisogno di un range molto ampio di lavoro visto che ogni volta la mole di lavoro cambia

      vi lascio in allegato una bozza di scuola 

      spero mi possiate aiutare

      `Sub Command()
          Dim filename As String, lineText As String
          Dim myrng As Range, i, j
          
          filename = ThisWorkbook.Path & "\Command.txt"
          
          Open filename For Output As #1
          
          Set myrng = Range("M4:M120")
          
      
      
          For i = 1 To myrng.Rows.Count
              For j = 1 To myrng.Columns.Count
                  lineText = IIf(j = 1, "", lineText & ",") & myrng.Cells(i, j)
              Next j
              Print #1, lineText
          Next i
          
          Close #1
       End Sub
      liteText = IIf()
      `
      Allegati:
      You must be logged in to view attached files.
      #7327 Score: 0 | Risposta

      vecchio frac
      Senior Moderator
        272 pts

        Ma cosa dovrebbe fare il listato? non hai descritto il problema cioè lo scenario...

        Comunque ho verificato che si ferma quando la cella è vuota... cioè quando la cella myrng.Cells(i, j) è vuota e non può essere processata.

        Allora, semplicemente, intercetti questa condizione e la gestisci (anche con un Iif visto che sai che esiste 🙂 )

        #7328 Score: 0 | Risposta

        Raid
        Partecipante
          1 pt

          mi scuso per la incomprensione

          allora questa Macro deve esportare il range selezionato in un file di testo.

          quando arriva ad una cella vuota ,visto che lo uso per molti calcoli o per pochi calcoli, si blocca

          a proposito di :

          Allora, semplicemente, intercetti questa condizione e la gestisci (anche con un Iif visto che sai che esiste   )

          come potrei fare

          io e visual basic non siamo amici, non ancora.

          ti ringrazio per il tuo tempo

           

          #7332 Score: 0 | Risposta

          vecchio frac
          Senior Moderator
            272 pts

            Ma quale sarebbe "il range selezionato" ? 

            Il codice che mostri non opera su una selezione, ma su una range di valori, e opera peraltro in modo strano perchè ci sono due cicli annidati, uno che riguarda le righe del range e uno che, per ogni riga esaminata, cicla all'interno del numero di colonne del range, che però vale sempre uno (perchè il range prescritto è M4:M120).

            Ho capito che 

            Raid wrote:

            quando arriva ad una cella vuota ,visto che lo uso per molti calcoli o per pochi calcoli, si blocca

             

            l'ho ben visto, e ho capito anche perchè, solo che anche funzionasse non farebbe quello che ti aspetti perchè lineText è sempre valorizzata solo su l'unica colonna del range... insomma esporti una serie di "1": è quello che vuoi? o vuoi esportare l'intera riga di dati?

            Il benedetto risultato atteso che chiediamo sempre...

            E per inciso, non chiamare una sub "Command()" perchè questa è una parola riservata di VBA e indica gli argomenti passati alla linea di comando (se mai qualcuno la usa ancora) 🙂

            #7335 Score: 0 | Risposta

            Raid
            Partecipante
              1 pt

              ok penso di aver compreso quello che vuoi sapere

              per risponderti:

              io dopo aver calcolato i dati che mi interessano, i risultati li voglio esportare su un file di testo

              da M4 A m120 (M120 é una cella che ho messo casualmente ma deve essere grande perché ogni volta, lavoro con dati diversi in quantità diverse quindi devo essere sicuro che lui mi vada ad esportare tutti i dati compresi in colonna escludendo gli errori e le celle vuote (gli errori o #valore nell'eventualità in cui in quella riga non abbia messo dei dati), e quindi possono essere tanti come hai visto sul allegato o pochi ,i dati.

              i dati esportati posso essere dei testi, dei numeri o una combinazione di numeri e caratteri (formule con incognite scritte da me o link per esempio).

              spero di aver risposto ai tuoi quesiti.

               

               

              #7337 Score: 0 | Risposta

              Raid
              Partecipante
                1 pt

                ho notato che se metto:

                myrng.Cells(i, j).Text 

                funziona ma mi mette anche #valore o div che io non voglio , che invece non devono essere inclusi nel file di testo

                #7338 Score: 0 | Risposta

                albatros54
                Moderatore
                  89 pts

                  La soluzione che propongo(sicuramente non piacr a VF, per quel GOTO  ) è questa:

                  Sub Command()
                  On Error Resume Next
                  Dim filename As String, lineText As String
                  Dim myrng As Range, i, j
                  filename = ThisWorkbook.Path & "\Command.txt"
                  Open filename For Output As #1
                  Set myrng = Range("M4:M160")
                  finalrow = Cells(Rows.Count, "M").End(xlUp).Row
                  For i = 1 To myrng.Rows.Count
                       For j = 1 To myrng.Columns.Count
                       If myrng.Cells(i, j) = "Errore 2007" Then
                      GoTo ritorno
                       End If
                              lineText = IIf(j = 1, "", lineText & ",") & myrng.Cells(i, j)
                  
                  Next j
                  Print #1, lineText
                  ritorno:
                  Next i
                  Close #1
                  End Sub

                   

                  Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
                  Sempre il mare, uomo libero, amerai!
                  ( Charles Baudelaire )
                  #7339 Score: 0 | Risposta

                  Raid
                  Partecipante
                    1 pt

                    hai usato il goto per saltare quella parte di macro quando non  c'è nulla.

                    #7340 Score: 0 | Risposta

                    Raid
                    Partecipante
                      1 pt

                      vi ringrazio entrambi per il tempo a me dedicato

                      GRAZIE MILLE

                      #7341 Score: 0 | Risposta

                      albatros54
                      Moderatore
                        89 pts

                        eliminiamo il goto dal codice precedente, prova cosi

                        `Sub Command()
                        On Error Resume Next
                        Dim filename As String, lineText As String
                        Dim myrng As Range, i, j
                        filename = ThisWorkbook.Path & "\Command.txt"
                        Open filename For Output As #1
                        Set myrng = Range("M4:M160")
                        finalrow = Cells(Rows.Count, "M").End(xlUp).Row
                        For i = 1 To myrng.Rows.Count
                             For j = 1 To myrng.Columns.Count
                            Select Case myrng.Cells(i, j)
                            Case "Errore 2007"
                            MsgBox "cella vuota"
                            Case Else
                                    lineText = IIf(j = 1, "", lineText & ",") & myrng.Cells(i, j)
                        End Select
                        Next j
                        Print #1, lineText
                        Next i
                        Close #1
                        End Sub`

                         

                        Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
                        Sempre il mare, uomo libero, amerai!
                        ( Charles Baudelaire )
                        #7347 Score: 0 | Risposta

                        Raid
                        Partecipante
                          1 pt

                          scusami 

                          la macro mi spamma " la cella è vuota e mi duplica l'ultima cella su quelle vuote

                          perciò se non vi dispiace userò quella con il GoTo

                          grazie

                          #7353 Score: 0 | Risposta

                          vecchio frac
                          Senior Moderator
                            272 pts

                            Raid wrote:per saltare quella parte di macro quando non  c'è nulla

                            Non è del tutto esatto, infatti con Goto si evita l'esecuzione della linea lineText = IIf(j = 1, "", lineText & ",") & myrng.Cells(i, j)

                            Quindi per servire, serve. Il punto è che io avrei affrontato in modo diverso (naturalmente senza Goto) 🙂 ma questa è una dimostrazione che ci sono stili diversi e anche modi diversi di approcciare le soluzioni   

                            Per esempio ,non capisco proprio perchè continuare a usare un ciclo For per una colonna sola: For j = 1 To myrng.Columns.Count

                            e poi si potrebbe testare if isempty(cell) e poi altro ancora   

                            #7356 Score: 1 | Risposta

                            Raid
                            Partecipante
                              1 pt

                              ti capisco.

                              io programmo in c/c++ e capita che nei forum che la gente usi delle funzioni che non siano del tutto inerenti (basta che funzione come si suol dire.

                              io ho chiesto al suo collega visto che era online dei libri di testo per imparare questo linguaggio e magari  poter essere d'aiuto e non un peso  

                              #7361 Score: 0 | Risposta

                              vecchio frac
                              Senior Moderator
                                272 pts

                                Raid wrote:per imparare questo linguaggio e magari  poter essere d'aiuto e non un peso

                                Guarda ti sei guadagnato un +1 🙂 iscriviti così te lo metto davvero 😛

                                E' importante soprattutto l'impostazione dell'algoritmo, della soluzione. Poi, come la si implementa dipende dal linguaggio e dallo stile personale. Io pasticcio da qualche anno con python e questo linguaggio risolve molti problemi con tale naturalezza che i diversi VB* non potevano offrire (VB.Net non so... mi sono fermato quando ho cominciato a metterci il naso)

                                 

                                edit by VF... eri già iscritto 🙂

                                #7365 Score: 0 | Risposta

                                vecchio frac
                                Senior Moderator
                                  272 pts

                                  Comunque aggiungo i miei 2 cent, la procedura la scriverei così.

                                  Option Explicit
                                  
                                  Sub elabora_command()
                                  Dim filename As String, lineText As Variant
                                  Dim myrng As Range, i As Long
                                  Dim finalrow As Long
                                  
                                      filename = ThisWorkbook.Path & "\Command.txt"
                                      Open filename For Output As #1
                                      Set myrng = Range("M4:M160")
                                      finalrow = Cells(Rows.Count, "M").End(xlUp).Row
                                      For i = 1 To myrng.Rows.Count
                                          lineText = myrng.Cells(i, 1)
                                          If Not IsError(lineText) And CStr(lineText) <> "" Then
                                              Print #1, lineText
                                          End If
                                      Next
                                      Close #1
                                      MsgBox "Fatto."
                                  End Sub
                                  #7367 Score: 0 | Risposta

                                  Raid
                                  Partecipante
                                    1 pt

                                    la cosa più bella secondo me è riuscire ad unire le capacità di 2 o più linguaggi per creare un algoritmo che sia flessibile senza troppi problemi.

                                    cit. c++ e python

                                    #7368 Score: 0 | Risposta

                                    Raid
                                    Partecipante
                                      1 pt

                                      come lavora?

                                      #7371 Score: 0 | Risposta

                                      vecchio frac
                                      Senior Moderator
                                        272 pts

                                        Ma l'algoritmo è solo la descrizione procedurale per risolvere un problema. E' l'implementazione che varia 🙂

                                        Python? è proprio un bel linguaggio 😛 ma qui vado OT

                                        #7372 Score: 0 | Risposta

                                        Raid
                                        Partecipante
                                          1 pt

                                          giusto un poco

                                        Login Registrati
                                        Stai vedendo 19 articoli - dal 1 a 19 (di 19 totali)
                                        Rispondi a: errore runtime 13 mismatch quando arriva ad una cella vuota
                                        Gli allegati sono permessi solo ad utenti REGISTRATI
                                        Le tue informazioni: