Recherche de très grandes chaînes dans une macro (Microsoft Excel)
Dans sa macro, Ian a besoin de localiser une chaîne courte dans une très grande chaîne. La grande chaîne est essentiellement le texte d’un fichier entier, parfois plus de 180 000 caractères. Ni Search () ni Find ()
fonctionne, à moins qu’il ne coupe la grande chaîne en parties plus petites (par exemple, moins de 32000 caractères) et recherche chaque partie à son tour. Le problème avec cette dissection est que Ian ne sait pas où dans le fichier son texte cible peut se trouver, ni même s’il se trouve là-dedans, et il est fort possible qu’il puisse couper son texte cible et ne jamais le trouver.
Il existe trois façons générales de rechercher l’instance d’une chaîne dans une autre dans VBA:
Méthode de recherche Méthode de recherche * Fonction InStr
Les deux premières approches sont celles que Ian mentionne spécifiquement, il sait donc comment les utiliser. Ce sont en fait des méthodes, utilisées avec l’objet WorksheetFunction. Ils sont essentiellement utilisés pour accéder aux fonctions de feuille de calcul FIND et SEARCH à partir de VBA.
Ils ne sont pas les meilleurs pour trouver des informations dans une grande et grande chaîne.
Pour cela, vous devez utiliser la fonction InStr, une fonction native de VBA.
Cela est particulièrement vrai si votre chaîne volumineuse et volumineuse est extraite d’un fichier texte et ne réside pas réellement dans un classeur.
Disons que vous avez un gros fichier texte dans lequel vous souhaitez rechercher une valeur de texte particulière. Vous pouvez lire le fichier entier en mémoire en une seule fois de cette manière:
Sub CheckFullFile() Dim sFullFile As String Dim sFindText As String Dim lFileSize As Long Dim lStart As Long Dim lLoc As Long Dim sMsg As String ' This is what you want to search for sFindText = "mytext" Open "c:\ReallyBigFile.txt" For Input As 1 lFileSize = Lof(1) sFullFile = Input(lFileSize, 1) Close 1 sFullFile = LCase(sFullFile) lStart = 0 lLoc = InStr(sFullFile, sFindText) While lLoc > 0 sMsg = sMsg & "Found at " & lLoc & vbCrLf lStart = lLoc + 1 lLoc = InStr(lStart, sFullFile, sFindText) Wend MsgBox sMsg End Sub
La macro ouvre le fichier texte spécifié, remplit tout le contenu du fichier dans la chaîne sFullFile et affiche toutes les instances de la variable sFindText dans ce texte. Notez que le contenu du fichier est converti en minuscules. Cela est nécessaire car la fonction InStr est sensible à la casse. Si vous souhaitez que votre recherche respecte la casse, vous n’avez pas besoin d’effectuer la conversion.
La seule limitation efficace d’un code comme celui-ci est la quantité de mémoire dont vous disposez dans votre système. VBA a une limite de longueur de chaîne effective de quelque part plus de 2 milliards de caractères, mais peu de systèmes ont autant de RAM en eux. Bien sûr, la plupart des fichiers texte que vous liriez n’approche pas non plus cette taille de fichier. Tester avec vos fichiers de données réels vous permettra de savoir si cette approche de lecture complète des fichiers fonctionnera pour vous.
Si vous avez un fichier texte contenant des lignes de texte individuelles, comme la plupart le font, il existe un moyen plus efficace de traiter le fichier et de rechercher votre texte. (Les lignes individuelles sont celles qui se terminent par un retour chariot et / ou un saut de ligne.)
Sub CheckEachLine() Dim sRaw As String Dim sFindText As String Dim lFileSize As Long Dim lStart As Long Dim lLoc As Long Dim sMsg As String ' This is what you want to search for sFindText = "mytext" Open "c:\ReallyBigFile.txt" For Input As 1 Do Until Eof(1) Line Input #1, sRaw sRaw = LCase(sRaw) lStart = 0 lLoc = InStr(sTemp, sFindText) While lLoc > 0 sMsg = sMsg & "Found at " & lLoc & vbCrLf lStart = lLoc + 1 lLoc = InStr(lStart, sRaw, sFindText) Wend Loop Close 1 MsgBox sMsg End Sub
Avec cette approche, vous n’avez pas à vous soucier vraiment de la longueur du fichier texte car une seule ligne à la fois est lue en mémoire et traitée.
Je suis sûr que vous comprenez l’idée – InStr est la voie à suivre lorsque vous voulez travailler avec la recherche d’informations dans des chaînes source étonnamment volumineuses.
_Note: _
Si vous souhaitez savoir comment utiliser les macros décrites sur cette page (ou sur toute autre page des sites ExcelTips), j’ai préparé une page spéciale qui comprend des informations utiles.
lien: / excelribbon-ExcelTipsMacros [Cliquez ici pour ouvrir cette page spéciale dans un nouvel onglet de navigateur]
.
ExcelTips est votre source pour une formation Microsoft Excel rentable.
Cette astuce (13660) s’applique à Microsoft Excel 2007, 2010, 2013, 2016, 2019 et Excel dans Office 365.