2016-12-09 2 views
4

J'ai écrit une macro dans vba, qui ouvre un fichier texte avec le bloc-notes, sélectionne tout txt et le copie dans Excel. Je dois traiter environ 100 fichiers par jour de cette façon et je veux épargner les images clignotantes que j'observe. Le code fonctionne mais le problème est que la commandeComment désactiver la mise à jour d'écran pour une autre application (bloc-notes)

Application.Screenupdating = False 

Ne fonctionne pas avec l'application Bloc-notes. Je ne peux utiliser que le focus normal, sinon le code ne fonctionne pas. Comment puis-je exécuter le code ci-dessous sans observer que le fichier bloc-notes est ouvert et traité?

Mon code est:

Sub GetTextFile() 
Application.ScreenUpdating = False 
Dim MyPath As String 
Dim MyFile As String 

MyPath = "C:\Users\bgyona02\Desktop\OLAttachments\" 

MyFile = Dir(MyPath & "*.txt", vbNormal)  

Do While Len(MyFile) > 0 
    MyFile = Dir 
Loop 

Debug.Print GetTextFileContent(" C:\Users\bgyona02\Desktop\OLAttachments\" & MyFile) 
    'MyFile = Shell("C:\WINDOWS\notepad.exe` C:\Users\bgyona02\Desktop\OLAttachments\" & MyFile, vbNormalFocus) 
    'SendKeys "^a", True '^A selects everything already in the pdf file. 
    'SendKeys "^c", True 
    'SendKeys "%fx", True 
End Sub 

Je ne pouvais pas trouver une solution de travail à ce sujet.

+0

* Quand je fais quelque chose de totalement stupide comme le Bloc-notes abus et le presse-papiers au lieu de faire les choses de la bonne façon, il provoque des problèmes. Quelqu'un peut-il me dire comment kludge encore plus pour cacher ces problèmes? * Est connu comme un problème XY. (Vous n'avez pas besoin de résoudre X si vous avez résolu Y correctement.) Le presse-papiers appartient à l'utilisateur, et vous n'avez pas besoin de Notepad pour ouvrir et lire le texte de VBA. –

Répondre

3

Il y a une réponse rapide comment exécuter le Bloc-notes, mais cacher la fenêtre et qu'il est d'utiliser vbHide au lieu de vbNormalFocus dans votre commande Shell:

Dim strCmd = "C:\WINDOWS\notepad.exe C:\Users\bgyona02\Desktop\OLAttachments\" & LatestFile 
MyFile = Shell(strCmd, vbHide) 

Mais je doute fort que SendKeys travaillerait alors sur un fenêtre invisible ....

Donc, ce n'est pas une réponse à la question, mais avez-vous envisagé d'utiliser le FileSystemObject et simplement lire le fichier sans réellement ouvrir Notepad.exe?

Option Explicit 

Const FOR_READING = 1 

Sub LoadTextFile() 
    Dim varTxtContent As Variant 
    Dim intLine As Integer 

    'Debug.Print GetTextFileContent("D:\temp.txt") 

    varTxtContent = Split(GetTextFileContent("D:\temp.txt"), vbCr, -1, vbBinaryCompare) 
    For intLine = 0 To UBound(varTxtContent) - 1 
     ThisWorkbook.Worksheets("Sheet1").Range("B" & intLine + 1).Value = varTxtContent(intLine) 
    Next intLine 


End Sub 

Function GetTextFileContent(strPath As String) As String 
    Dim strContent As String 
    Dim objFso As Object 
    Dim objFile As Object 
    Dim objStream As Object 

    strContent = "" 
    On Error GoTo CleanUp: 

    Set objFso = CreateObject("Scripting.FileSystemObject") 
    Set objFile = objFso.GetFile(strPath) 
    Set objStream = objFile.OpenAsTextStream(FOR_READING, 0) 

    With objStream 
     strContent = .ReadAll 
     .Close 
    End With 

CleanUp: 
    Set objStream = Nothing 
    Set objFile = Nothing 
    Set objFso = Nothing 
    GetTextFileContent = strContent 

End Function 

Le code fonctionnera avec des caractères accentués, par ex. mon fichier texte de test est:

â, î or ô 
foo 
bar foo 
baz bar foo 

Pour autant que je sache, Application.ScreenUpdating ne s'appliquera à votre session Excel et pas d'autres programmes en cours dans Windows. Donc, pour effectivement arrêter ces fenêtres apparaissant - mais toujours être capable de lire le contenu de la fenêtre - vous auriez à faire quelque chose de raisonnablement complexe avec l'API Windows. L'utilisation de FileSystemObject est beaucoup, beaucoup plus simple.

HTH.

+1

Salut Robin, merci pour votre réponse. J'ai essayé d'ouvrir le fichier texte à partir d'Excel, mais j'ai un problème avec les caractères accentués. Lorsque j'ouvre le fichier texte via le bloc-notes, tous les caractères sont correctement affichés. C'est pourquoi je suis à la recherche d'une solution avec l'éditeur txt – Badan

+0

Pouvez-vous donner un exemple du type de texte avec lequel vous travaillez? –

+0

J'ai mis à jour le code pour travailler avec?,? Ou? –

0

J'ai finalement trouvé une solution très élégante capable de gérer des applications externes. Tout le mérite devrait aller à Robert Schutt pour avoir écrit ce code de chef-d'œuvre. Cela rend la fenêtre du bloc-notes 1 pixel, donc aucune image clignotante n'est observée. Il semble assez compliqué pour moi, mais il m'a sauvé la journée:

Option Explicit 

Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long 

Public Const GW_HWNDNEXT As Long = 2 
Public Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long 
Public Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long 
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwprocessid As Long) As Long 

Function ProcIDFromWnd(ByVal hwnd As Long) As Long 
    Dim idProc As Long 

    ' Get PID for this HWnd 
    GetWindowThreadProcessId hwnd, idProc 
    ProcIDFromWnd = idProc 
End Function 

Function GetWinHandle(hInstance As Long) As Long 
    Dim tempHwnd As Long 

    ' Grab the first window handle that Windows finds: 
    tempHwnd = FindWindow(vbNullString, vbNullString) 

    ' Loop until you find a match or there are no more window handles: 
    Do Until tempHwnd = 0 
     ' Check if no parent for this window 
     If GetParent(tempHwnd) = 0 Then 
     ' Check for PID match 
     If hInstance = ProcIDFromWnd(tempHwnd) Then 
      ' Return found handle 
      GetWinHandle = tempHwnd 
      ' Exit search loop 
      Exit Do 
     End If 
     End If 

     ' Get the next window handle 
     tempHwnd = GetWindow(tempHwnd, GW_HWNDNEXT) 
    Loop 
End Function 

Sub MinimizeNotepad() 
    Dim retval As Long, np_retval As Long 
    np_retval = Shell("C:\notepad.exe", vbNormalFocus) 
    retval = MoveWindow(GetWinHandle(np_retval), 1, 1, 1, 1, 1) ' Application.hwnd 
End Sub