32 votes

Range.Replace est toujours vrai pour Chr(1)

Pour l'instant, je suis confus. J'allais créer une réponse pour cette question .

En effectuant quelques tests, j'ai remarqué que

ActiveSheet.Cells.Replace Chr(1), "", xlPart, , True, , False, False

efface complètement la feuille. Il est logique que Chr(42) qui est * mais pourquoi Chr(1) ?

Quelqu'un en connaît-il la raison ? S'agit-il d'une sorte de deuxième emplacement caché ?
(Impossible de trouver quelque chose, mais j'ai probablement utilisé les mauvais termes de recherche)

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 :D

2 votes

C'est très intéressant. Voici ce que j'ai trouvé. Chr(1) signifie un Start 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) .

11voto

jainashish Points 1086

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.

SOH Replace ALL in EXCEL


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 (*).

Time taken to replace text


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

2 votes

Cette réponse explique tout en détail tout en étant facile à comprendre. Pour montrer ma gratitude à cette excellente réponse, j'ai ajouté une prime de 100 points qui sera appliquée dès que possible. (Les primes sont bloquées pendant 24 heures)

0 votes

Je ne suis pas sûr que votre benchmark soit valable - lorsque j'exécute ce code, j'obtiens une distribution presque parfaitement égale des résultats pour les 25 itérations, avec environ la moitié des exécutions prenant plus de temps avec chaque méthode. Le site Timer renvoie également les secondes, et non les millisecondes ;-).

1 votes

Très intéressant.

0voto

Je pense avoir trouvé la réponse.
Comment j'ai trouvé.
J'ai tapé "Alt+1" (1 du pavé numérique) et j'ai obtenu ce " ?" (point d'interrogation).
Maintenant j'ai tapé le code ci-dessous, qui efface la feuille.

ActiveSheet.Cells.Replace "?", "", xlPart, , True, , False, False

0voto

tysonwright Points 1359

ASCII 1 est 'SOH' (Start of Heading), et ASCII 2 'STX' signifie la fin de l'en-tête, le début du flux de données. (Cela vous permet de "cacher" des adresses, des notes, etc., dans un fichier avant les données réelles du fichier). Il semble qu'Excel interprète votre commande comme commençant au début du fichier et incluant tout.

0 votes

A priori, Excel vérifie directement les chaînes de caractères à l'intérieur des cellules (et non les données dans leur ensemble). Cela inclut le formatage, mais ignore la structure (vous ne pouvez donc pas corrompre le fichier).

-3voto

Sonu Kumar Points 63

ASCII 1, tel qu'identifié par de nombreuses personnes, est interprété par les applications comme le début de l'en-tête de chaque caractère. Cependant, les caractères spéciaux peuvent être échappés par d'autres caractères ('~' est un caractère d'échappement dans Excel). Vérifiez ici

Je pense que vous devriez éviter de remplacer par chr(1) dans votre code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X