La raison peut être déduite de la différence entre
-
NUL : Aucun caractère. Il est utilisé pour remplir le temps ou l'espace sur la surface (comme la surface du plateau) du dispositif de stockage où il n'y a pas de données. Nous utiliserons ce caractère lorsque nous programmerons des effaceurs de données (destructifs et non destructifs) pour effacer l'espace non alloué afin que les données effacées ne puissent être récupérées par personne ou par un programme.
-
SOH : Ce caractère est utilisé pour indiquer le début d'une rubrique, qui peut contenir des informations d'adresse ou de routage.
-
STX : Ce caractère est utilisé pour indiquer le début du texte et de cette manière, il est également utilisé pour indiquer la fin de l'intitulé.
Source de la définition
Divers commentaires ont déjà souligné que ces caractères (les 32 premiers) sont appelés les caractères de contrôle parce que ces caractères effectuent diverses opérations de contrôle de l'imprimante et de l'affichage plutôt que d'afficher des symboles.
Dans Hadoop, SOH est souvent utilisé comme séparateur de champs, notamment lors de la lecture de fichiers CSV. De même, en ouvrant le fichier Excel (sans le décompresser en xlsx brut, c'est-à-dire en binaire) dans Notepad++ et en imprimant les caractères de contrôle, on verra beaucoup de caractères SOH. En raison des fonctions de sécurité, il ne sera pas possible de voir les données réelles.
chr(0) = SOH est un pointeur vers l'adresse mémoire de toutes les cellules contenant le TEXTE.
et
chr(1) = NUL est un pointeur vers l'adresse mémoire de toutes les cellules contenant NULL ou BLANK CELLS.
Regardons les déclarations ci-dessus dans la perspective des différentes commandes montrées dans l'image ci-dessous. Le haut à gauche est la plage de données originale et l'exemple montre comment le remplacement fonctionne pour SOH, NUL et ASTERISK (*) en utilisant la fonction Range.Replace.
Alors, pourquoi Chr(0) & Chr(1) sont capables de remplacer les valeurs dans la cellule Excel si elles sont simplement des pointeurs d'adresse et comment chr(1) agit différemment de chr(42) ?
Cela se produit en raison de la structure d'une feuille de calcul Excel. Lorsque vous ouvrez un tout nouveau classeur Excel, les cellules Excel ne sont pas marquées. C'est complètement visuel et dans la mémoire dure et douce du système.
Cependant, dès que l'on entre quelque chose dans la cellule B2, toutes les CELLULES BLANCHES au carré jusqu'à B2 recevront un pointeur avec Chr(0) et la cellule B2 recevra un pointeur avec Chr(1).
Maintenant, si l'on supprime le contenu de la cellule B2, alors, avec les autres cellules, B2 se verra attribuer un pointeur NUL ou Chr(0).
C'est également la raison pour laquelle le simple fait d'effacer le contenu à l'aide de Cells.ClearContents n'efface pas les cellules en mémoire et que le classeur Excel se gonfle lorsqu'une cellule éloignée a été utilisée mais pas supprimée à l'aide de Cells.Clear ou Ctrl+Delete.
Maintenant, bien qu'il soit clair pourquoi Excel remplace le contenu ou efface la feuille de calcul avec la commande donnée. Il est également important de comprendre la différence entre l'astérisque (*) et SOH [ou Chr(0)].
L'astérisque (*) remplace le contenu des cellules de longueur minimale 0.
Alors que Chr(0) identifie les cellules avec SOH, c'est-à-dire les cellules contenant la valeur, puis remplace la valeur à la destination du pointeur.
La différence ne réside pas dans le résultat mais dans la manière dont les cellules à remplacer sont trouvées ou identifiées.
J'ai créé une petite macro pour valider les hypothèses dans laquelle j'enregistre le temps nécessaire pour remplacer un demi-million de cellules (A1 à CZ5000) en utilisant Chr(1) = SOH et Chr(42) = *.
Il s'avère que l'utilisation du pointeur vers l'adresse des cellules avec TEXT, c'est-à-dire SOH, prend moins de temps que ASTERISK (*).
Sub Replace_Timer()
Sheet3.Activate
Dim startTime, endTime
Dim i As Integer
Sheet3.Range("A1:CZ5000").Value = "A"
For i = 1 To 25
startTime = Timer
Sheet3.Cells.Replace Chr(1), "X", xlPart, xlRows, False
endTime = Timer
Sheet4.Cells(i + 1, 2).Value = endTime - startTime 'Execution time in miliseconds
startTime = Timer
Sheet3.Cells.Replace Chr(42), "Z", xlPart, xlRows, False
endTime = Timer
Sheet4.Cells(i + 1, 3).Value = endTime - startTime 'Execution time in miliseconds
Next
Sheet4.Activate
End Sub
5 votes
Intéressant. Ça doit être une fonctionnalité non documentée.
0 votes
Juste une heure... mais j'ai l'impression que ça va se terminer par un prime... aussi...
[A1].value = "-" & Chr(1) & "-"
ça a l'air assez bizarre :D2 votes
C'est très intéressant. Voici ce que j'ai trouvé.
Chr(1)
signifie unStart of Heading
et voici le document ( cs.tut.fi/~jkorpela/chars/c0.html ) décrit tous les caractères de contrôle ASCII. Un autre site Web du gouvernement ( its.bldrdoc.gov/fs-1037/dir-034/_5089.htm ) a une meilleure explication "toujours déroutante" àChr(1)
.0 votes
@ian0411 Je sais ce que
chr(1)
Je ne comprends pas pourquoi Excel agit comme il le ferait avec l'astérisque (caractère de remplacement) mais pas avec les autres caractères non imprimables. Il semble que quelque chose de profond dans l'application elle-même "perturbe" Excel. Je suis donc assez curieux de savoir ce qui se passe là-dessous. (Je suis quand même sûr que je ne suis pas capable de le comprendre pour de vrai) :P4 votes
Je suis aussi confus que vous. Vous avez probablement trouvé une fonctionnalité monstre que MS ne connaît même pas.
0 votes
Encore plus intéressant : - Chr(1) - déplace le - final sur un espace, mais il n'est pas sélectionnable... et vous ne pouvez pas trouver et remplacer Chr(1) sans VBA.
2 votes
Je suppose que
Chr(1)
est le véritable caractère de remplacement (sinon il ne serait pas possible de rechercher "*") mais comme il n'y a aucun moyen de faire exactement cela (pour autant que je sache), il pourrait s'agir d'un "reste". Mais si aucun "programmeur" ne s'arrête ici par hasard, je doute que j'obtienne une réponse appropriée. :/0 votes
Pour votre information, bien que le problème ne soit pas tout à fait le même, il pourrait être intéressant de jeter un coup d'œil à Pourquoi Application.Clean supprime-t-il les caractères imprimables ? stackoverflow.com/questions/27641324/
0 votes
Chr(63)
qui est?
fait la même chose0 votes
@KarthickGunasekaran le
?
est le substitut d'un seul caractère, tandis que*
est l'espace réservé pour n'importe quel nombre de caractères...0 votes
@Dirk Reichel, alors pourquoi nettoie-t-il tous les caractères dans une feuille ?
0 votes
@KarthickGunasekaran Parce que vous cherchez
xlPart
ainsi toutes les occurrences seront remplacées (si l'on remplace "a" par "c" alors "aba" devient "cbc"). De cette façon, toutes les chaînes de caractères seront effacées char par char) ;)1 votes
En savoir plus
chr(1)
ici et ici .0 votes
@DirkReichel "a l'air assez bizarre", tout comme les caractères jusqu'à 7 lorsqu'ils sont entrés dans une cellule.
0 votes
Un cas intéressant en effet. J'ai constaté que lorsque l'on ajoute plusieurs instances de Chr(1) à une seule cellule et qu'on les remplace par une valeur aléatoire, le remplacement ne se fait qu'une fois dans cette cellule. Je suppose donc qu'il ne cherche pas réellement cette valeur, mais qu'il remplace toutes les cellules qui ne sont pas vides.
0 votes
Lorsque l'on insère plusieurs instances de Chr(1) dans une chaîne de caractères et que l'on exécute ensuite replace sur celle-ci, toutes les instances sont capturées. Il semble que ce comportement étrange ne se produise que lorsque l'on fait directement référence à des cellules.
0 votes
Il jette Erreur d'exécution '9' : Indice hors de portée pour moi :/
0 votes
Par curiosité, lorsque vous effectuez cette opération, si vous enregistrez le classeur par la suite, est-il corrompu de quelque manière que ce soit lorsque vous essayez de l'ouvrir à nouveau ?
3 votes
Je pense que le comportement d'Excel est lié à l'interprétation de chr(1). Essayez de l'exécuter :
SendKeys Chr(1)
cela fonctionne comme CTRL+A,Chr(2)
fonctionne comme CTRL+B etc. (plus de détails ici dc.org/files/asciitable.pdf ). Il se peut que vba interprète chr(1) comme 'select all' et que toutes les cellules non vides soient remplacées.0 votes
@TomJohnRiddle, en fait, Chr(1) (entre autres) n'est pas supporté par Windows. Il semble que votre hypothèse soit la bonne. L'interprétation de Chr(1) par Excel sera de tout sélectionner. Dans le cas de OP, il remplacera par des cellules vides. Mais voyez ce qui se passe lorsque vous essayez de remplacer par "Hello". Cela fonctionnera également sur n'importe quelle autre plage :)
1 votes
Je ne suis pas sûr de la partie "tout sélectionner". D'une certaine manière, cela a du sens, mais replace est une fonction qui compare deux chaînes de caractères. S'il y a "2.0" et que vous essayez de remplacer "0" par quelque chose, rien ne se passera, mais à "2.01", cela se fera. Donc les valeurs numériques seront converties (en ignorant le formatage des nombres). Le fait de chercher un nombre ou une chaîne de caractères n'a pas d'importance. Le programme compare simplement deux chaînes de caractères. Aucune cellule ne sera sélectionnée, ni aucun texte à l'intérieur des cellules. Si cette fonction devait "sélectionner" quelque chose, elle serait extrêmement lente. De plus, le fait d'avoir chr(1) à l'intérieur d'une cellule ne retourne pas l'effet.
0 votes
Alors que
ActiveSheet.Cells.Find(Chr(1), ActiveCell).Activate
se comportera également comme si la condition était toujours remplie, alors que d'autres méthodes de comparaison ne présentent pas ce comportement, par exempleinstr()
. Et juste un conseil : cela fonctionne également si vous ouvrez la fenêtre de remplacement et collez le fichierChr(1)
dans le champ de recherche. Et comme une autre "contra" pour le "select all" : Microsoft Word ne montre pas du tout ce comportement.