› Sviluppare funzionalita su Microsoft Office con VBA › errore runtime 13 mismatch quando arriva ad una cella vuota
-
AutoreArticoli
-
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.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 🙂 )
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
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
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) 🙂
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.
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
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 SubQual è 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 )hai usato il goto per saltare quella parte di macro quando non c'è nulla.

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 )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
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.Counte poi si potrebbe testare if isempty(cell) e poi altro ancora
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
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 🙂
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 Subla 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
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
-
AutoreArticoli
