Éviter extra “retour chariot” dans Print avec Visual Basic?
Avec Visual Basic, je suis confus avec ce que le comportement de l'instruction Print dans que, parfois, la déclaration suivante: créerait d'autres retour chariot "^M" à la fin d'une ligne, mais parfois, ça ne marche pas. - Je vous demander pourquoi?
filePath = "d:\tmp\FAE-IMM-Report-2012-Week.org"
If Dir(filePath) <> "" Then
Kill filePath
End If
outFile = FreeFile()
Open filePath For Output As outFile
Print #outFile, "#+TITLE: Weekly Report"
serait de produire des
#+TITLE: Weekly Report^M
alors que je le souhaite, sans ^M:
#+TITLE: Weekly Report
Dans un programme d'essai, presque le même code il n'y aurait aucun "^M".
S'il vous plaît aider! Merci beaucoup.
Après plus d'expérience, j'ai constaté que la suggestion suivante à l'aide de vbNewline et de ";" à la fin de l'impression du contenu, n'est toujours pas résolu mon problème.
Après un isolement, j'ai trouvé la cause du problème est un personnage qui semble comme un espace, non pas exactement de l'espace, suivi par un saut de ligne et retour chariot. Avant d'imprimer le texte contenant la délinquance de la chaîne, il n'y a pas de retour chariot, mais une fois la ligne incriminée est imprimé, puis chaque ligne, y compris la ligne précédente imprimé aurait un retour chariot.
Je ne suis pas sûr de ce que exactement la délinquance de la chaîne est que mes compétences de VBA n'est pas encore trop bien.
Voici une copie de la délinquance texte à partir d'une cellule de feuille de calcul:
"There is something invisible after this visible text
After the invisible text, then there might be a carriage return $Chr(13) and/or newline"
Je ne suis pas sûr si la pâte sur un navigateur web serait de préserver le contenu. En collant à emacs, je ne vois pas de retour chariot, tandis que emacs doit l'afficher, si il y en a un. Donc je suppose qu'il n'y a pas de retour chariot dans la délinquance de la chaîne.
Ci-dessous le programme de démontrer le problème:
Sub DemoCarriageReturnWillAppear()
Dim filePath As String
Dim outFile
Dim offendingText
filePath = "d:\tmp\demoCarriageReturn.org"
If Dir(filePath) <> "" Then
Kill filePath
End If
outFile = FreeFile()
Open filePath For Output As outFile
Print #outFile, "#+AUTHOR: Yu Shen" & vbNewLine;
Close #outFile 'At this moment, there is no carriage return
Open filePath For Append As outFile
offendingText = ThisWorkbook.Worksheets("Sheet1").Range("A1")
Print #outFile, offendingText & vbNewLine;
Close #outFile 'Now, every line end has carriage return.
'It must be caused by something offending at the above print out content.
End Sub
Voici le résultat final de la procédure ci-dessus:
#+AUTHOR: Yu Shen^M
There is something invisible after this visible text
After the invisible text, then there might be a carriage return $Chr(13) or newline^M
Remarque ci-dessus "^M" est ajouté par moi-même, étant donné que le transport de retour ne serait pas visible dans le navigateur.
Si vous êtes intéressé, je peux vous envoyer le fichier excel avec le contenu incriminé.
J'ai besoin de votre aide sur la façon d'éviter ces délinquance de la chaîne, ou les retours à la ligne.
(J'ai même essayer de faire de la chaîne de Remplacer le transport de retour à la ligne, j'ai trouvé que lorsque je l'ai supprimé manuellement quelle que soit causé un changement à l'autre de la ligne, le problème aurait disparu. Mais l'appel de Remplacer de remplacer vbNewline, Chr$(13), ou vbCrLf ne faisait aucune différence.
Merci pour votre aide!
Yu
OriginalL'auteur Yu Shen | 2012-02-25
Vous devez vous connecter pour publier un commentaire.
Utiliser un point-virgule de fin de réduire la ligne nouvelle:
L'Éditeur VB souvent ajouter un point-virgule si vous faites une erreur dans l'énoncé, ce qui pourrait expliquer pourquoi la nouvelle ligne est parfois sortie et parfois pas.
Nouvelle routine de diagnostic
Nous avons besoin de connaître les caractères à l'intérieur de la cellule A1 qui est à l'origine du problème.
Place de la sous-routine suivante au sein de l'un de vos modules.
Aller à l'Éditeur VB Immédiate de la fenêtre et tapez le texte suivant suivant par
Return
:Au-dessous de cette ligne, vous devriez voir quelque chose comme
54 65 73 74 31
. C'est une liste de la valeur de code de chaque caractère dans la cellule. Je pense que nous allons voirA
, le code de saut de ligne, ouD
, le code de retour chariot à la fin de la liste.Placez le curseur dans la cellule A1. Cliquez sur
F2
sélectionnez modifier, puis enBackspace
pour supprimer l'invisible de fuite caractèreReturn
à la fin de la modifier. Revenir à la Fenêtre, placez le curseur à la fin deDsplInHex(Sheets("Sheet1").range("A1"))
et cliquez surReturn
. La fuite personnage devrait avoir disparu.Essayer et d'en faire rapport. Bonne chance.
Désolé, je n'ai pas l'usage du point-virgule aussi clair que je devrais avoir. Si vous lisez la documentation sur le
Print # Statement
, vous trouverez le point-virgule est mentionné souscharpos
."XX" & vbNewLine;
est exactement le même que"XX"
.vbNewLine
ajoute une nouvelle ligne de sorte que vous pouvez générer plusieurs lignes en une seule instruction.;
dit que la prochaine sortie est à suivre immédiatement. Les règles sont les mêmes pourDebug.Print
qui écrit à la Fenêtre d'exécution. Je vous suggère d'expérience.Désolé, cette solution ne résout pas mon problème. Veuillez voir mes autres caractérisation de mon problème ci-dessus.
J'ai ajouté une nouvelle section à ma réponse qui, je l'espère, nous permettra d'identifier le problème.
Salut Tony, votre suggestion travaillé! À l'aide de votre script, j'ai imprimé les valeurs de délinquance de la chaîne. Le code hexadécimal est de 20 A (qui est un espace suivi d'un saut de ligne). À trouver, j'ai utilisé la fonction remplacer de remplacer le saut de ligne par l'espace, alors le problème est résolu! C'était un méchant bug de VBA 6 (avec Excel 2007).
OriginalL'auteur Tony Dallimore
Pour aider les autres personnes dans le futur, voici un résumé de mon problème et de la solution. Le retour chariot supplémentaire sur chaque ligne, même avec un point-virgule à l'instruction print-end a été effectivement causé par une chaîne de caractères de l'espace, suivi de retour à la ligne (Chr$(A)) dans l'une de l'instruction print, une fois que cette chaîne est imprimé, puis toutes les précédentes et suivantes imprimé le contenu aurait un retour de chariot supplémentaire!
Il semble un bug sur VBA 6 (avec Excel 2007), un méchant!
Mon travail a été de remplacer le saut de ligne par un espace.
Merci pour Tony répétée de l'aide me permettant enfin trouvé la cause.
Voici le code pour illustrer le problème:
Après le premier "Fermer #outFile", voici le contenu du fichier demoCarriageReturn.org:
Remarque: avec l'éditeur capable montrant retour chariot comme visible ^M, il n'y a pas de retour chariot présent.
Cependant, après la deuxième "Fermer #outFile", voici le contenu du fichier même avec du contenu supplémentaire:
Remarque: il y a deux retours chariot apparaissent. Ils ne sont pas destinés. En particulier, à la première ligne, l'imprimer instruction a été exécutée, et lors de la précédente fermeture de l'instruction, il a été constaté sans retour chariot. (Pour illustrer un retour chariot, je dois taper ^M dans la page web ici. Mais c'est dans le fichier de l'impression.)
C'est pourquoi je pense que c'est un bug, comme les retours à la ligne ne sont pas destinés. Il est indésirable surprise.
Le code suivant montre que si je filtre le caractère de saut de ligne, le problème aurait disparu.
Après l'exécution complète du programme ci-dessus, il n'existe en effet pas de retour chariot!
Cela montre que la chaîne de la combinaison de l'espace, suivi de retour à la ligne provoqué le bug, et supprimer le saut de ligne peut éviter le bug.
Le code suivant démontrent en outre que si il n'y a pas de délinquance de la chaîne, même sans retour à la ligne et le point-virgule à la fin de l'instruction d'impression, il n'y aurait pas indésirable retour chariot!
Également dans le résultat de sortie:
Toujours pas de l'ennuyeux retour chariot!
Cela montre que à l'aide de retour à la ligne suivie par un point-virgule à la fin de l'instruction d'impression n'est pas la solution au problème de retour chariot à chaque ligne! La vraie solution est d'éviter toute chaîne de caractères de l'espace, suivi de retour à la ligne en imprimer le contenu.
Yu
Alt
+Return
. Les gens l'utilisent pause long des champs de texte en paragraphes. Vous n'avez pas à utiliserReplace
. Si vous aviez editted la cellule, vous auriez vu que le curseur était placé sous le texte.Backspace
aurait supprimé le saut de ligne et a causé déplacer le curseur jusqu'à la fin de la ligne précédente.Mais je suis étonné de voir qu'avec une seule chaîne d'espace, suivi de retour à la ligne, VBA ajoute un retour chariot à tous d'imprimer des lignes de même avant de la délinquance de la chaîne a été imprimé! Ce n'est pas vraiment un comportement souhaitable. Il serait OK pour préserver le saut de ligne pour l'impression de chaîne avec le saut de ligne.
Le cahier des charges pour l'instruction Print # est absolument clair: "Si charpos est omis, le caractère suivant est imprimé sur la ligne suivante." C'est, à un saut de ligne sera ajoutée à la chaîne de sortie, sauf si vous l'état explicite qu'il n'est pas d'être ajouté.
Print #fn "Line 1" & vbLf & "Line 2" & vbLf & "Line 3"
est valide. C'est, une instruction Print # peut beaucoup de lignes de sortie. Le compilateur ne peut pas savoir que vous n'avez pas moyen d'avoir un saut de ligne à la fin de la valeur de la cellule; c'est ce qu'il est dit de le faire ce n'est pas ce que vous signifiait pour lui dire de ne.Être en mesure d'inclure des sauts de ligne dans les chaînes est parfois pratique. Il n'était pas pratique pour vous, en cette occasion, mais ça n'en fait pas un bug. Maintenant que vous savez que vous pouvez inclure des sauts de ligne en imprimer des chaînes de caractères, il ne sera pas long avant que vous prenez avantage de cette installation.
Pourquoi avez-vous unaccepted ma réponse?
OriginalL'auteur Yu Shen