2017-06-19 1 views
2

Ich habe Probleme beim Drucken von Werten in einer Textdatei. Wann immer ich ein Datum oder Zahlen habe, bekomme ich einen "Fehler 13" ... Ich denke, es ist mit meinen Variablen verknüpft, aber ich kann nicht verstehen, wo das Problem liegt.VBA - Drucken von Zeilen in eine TXT-Datei

Sub SX_Externe_Generate_TXT() 
Dim WsCib As Worksheet 
Dim LastCol, LastRow, i, j As Byte 

Application.ScreenUpdating = False 

Set Ws = ThisWorkbook.Sheets("Externe") 
Set WsCib = ThisWorkbook.Sheets("SX_Externe") 
LastCol = WsCib.Cells(1, 1).SpecialCells(xlCellTypeLastCell).Column 
LastRow = WsCib.Cells(1, 1).SpecialCells(xlCellTypeLastCell).Row 

WsCib.Activate 

Open "C:\Users\xizx692\Desktop\SX_Externe_Temp.txt" For Output As #1 'Tu crées le fichier text 

i = 1 

For i = 1 To LastRow 
j = 1 
    For j = 1 To LastCol 
     Print #1, WsCib.Cells(i, j).Value + ";"; 'Séparateur = ; 
    Next j 
    Print #1, WsCib.Cells(i, j + 1).Value 'pas de séparateur (Saut de ligne) 
Next i 

Close #1 

Ws.Activate 

Application.ScreenUpdating = False 

End Sub 

Der Fehler kommt an dieser Linie Print # 1, WsCib.Cells (i, j) .Value + ";" 'Séparateur =; immer wenn die Zellen (i, j) .value ist ein Datum oder eine Zahl Format.

Vielen Dank für Ihre Hilfe im Voraus.

BR,

Jean

Antwort

3
Print #1, WsCib.Cells(i, j).Value + ";"; 'Séparateur = ; 

den Verkettungsoperator in VBA ist &, nicht+. Letzteres funktioniert manchmal, wenn beide Operanden Strings sind.

Nummer + String wirft Laufzeitfehler 13, wenn die Zeichenfolge in eine Zahl umgewandelt werden kann, aber VBA wird nie die Zahl in einen String konvertieren, wenn + verwendet wird, wird es nur versuchen arithmetische Addition in diesem Fall.

Print #1, WsCib.Cells(i, j).Value & ";"; 'Séparateur = 
'        ^^^ 

Dies wird die Frage auf der Hand, lösen aber es gibt ein paar andere Dinge, die geändert werden sollen.

  • Dim LastCol, LastRow, i, j As Byte diese Aussage erklärt j als Byte und alle anderen als Variant. Dim alle, und verwenden Sie lange anstelle von Byte, denn Long sollte immer Ihre natürliche Wahl für Integer-Variablen sein, es sei denn, es gibt einen bestimmten Grund.

     `Dim LastCol as Long, LastRow As Long, i as Long, j As Long` 
    
  • i=1 und j=1 überflüssig sind, lassen Sie die For Anweisung tun, um die Initialisierungsauftrag

  • Die Aussage Print #1, WsCib.Cells(i, j + 1).Value ist auch überflüssig, da die Zelle leer ist. Um eine leere Zeile zu drucken, einfach Print #1, "". Obwohl es das gleiche tut, aber es ist besser für Lesbarkeit Ihres Codes.

+0

Ash, vielen Dank für Ihre Antwort. Es hilft mir, mein Problem zu lösen und außerdem: Es bringt mir großartige Dinge bei. Der Grund, warum ich "Bytes" verwendet habe, ist, weil ich weiß, dass es weniger als 250 Zeilen geben wird und ich dachte, dass mein Code schneller wird ... Schande über mich? Ich kannte das j nicht und ich ging am Ende der Schleife zurück zu "1", deshalb wollte ich j = 1 erzwingen! Möchten Sie an einer anderen Frage teilnehmen, die ich gestellt habe? [Gehen Sie hier] (https://stackoverflow.com/questions/44592776/action-when-linked-cell-of-option-button-changes/44593266#44593266) wenn ja! ** Löse sie alle, D ** –

+0

Dachte, warum LastCol, LastRow und ich als Variante definieren? Danke! –

+1

@ Jean-FIC Ich meinte, dass Ihre ursprüngliche Aussage sie als Variante deklariert, nicht als Byte. Verwenden Sie "Long" für alle Ihre Integer-Variablen, da es 32 Bit lang ist und somit am schnellsten und weniger anfällig für Überlauf ist. Die einzige Stelle, an der Sie an "Integer" oder "Byte" denken würden, ist, wenn Sie * riesige Arrays * haben, die Speicherprobleme verursachen können. –