Ouverture et modification de fichier * txt dans une macro VB
whitelegend030
Messages postés23Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention 1 février 2010
-
13 nov. 2007 à 11:44
whitelegend030
Messages postés23Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention 1 février 2010
-
29 nov. 2007 à 07:57
Bonjour,
Je viens souvent voir ce site dès que j'ai besoin d'un petit coup de main, mais aujurd'hui je sèche... ca fait 1 heure que je gratte mais je ne trouve aucun code satisfaisant. Pourriez-vous m'aider.
J'ai un fichier excel, après une macro de mise à jour je souhaite copier un certain nombre de cellules pour pouvoir les coller dans un fichier *txt qui me sert ensuite de base de donnée pour lancer une recherche dans un logiciel.
Et maintenant je voudrais ouvrir le fichier "C:\Documents and Settings\lopesc\Desktop\SAP_Temp.txt", le vider totalement ( ex: Ctrl+A ; suppr) et y coller les cellules copiées plus haut.
Ensuite enregistrer le fichier et le fermer.
Voila j'espère que vous m'aiderez.
Merci à tous pour vos aides si prévieuse disponible ici.
whitelegend030
Messages postés23Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention 1 février 2010 13 nov. 2007 à 14:17
En parcourant internet il me semble que le code que tu m'as donné ressemblerait a un code " VBScript" .... je dis ca car il me semble avoir compris que c'était ca quand on voyait des " # ".
Au cas ou tu ne l'aurais pas vu je suis plutot très novice ... ^^"
Je vais te mettre la macro que je me susi faite j'espère que tu ne vas pas vouloir me tuer en voyant ca, car ca doit surement être horrible pour des avertis ...
J'ai mis ton code à la fin dans l'attribut " line53"
Sub Macro_NCR()
'Macro pour mettre à jour le tableau à partir de l'ABAP SAP
'
'
'Règle de recherche SAP:
'CREATED BY: "LOPESC"
'VARIANT NAME: "LOPESC NOQA"
'Short Description: "ALL NCR SEARCH without QA"
'
'
'
'Test de départ avant lancement de la macro si l'ABAp est bien présent dans la feuille "(MàJ journalière)"
Sheets("(MàJ journalière)").Select
If Range("B2").Value = "" Then
GoTo line50 'Renvoie à la fin de la macro car ABAP manquant
Else
GoTo line51 'Renvoie sur la suite de la macro pour éxécution
End If
line51:
'Actualiser calculs
Calculate
Sheets("Clôturés").Select
Selection.AutoFilter Field:=18, Criteria1:="<>"
ActiveSheet.ShowAllData
'Traitement des dates dans MàJ
Sheets("(MàJ journalière)").Select
Columns("I:J").Select
Selection.NumberFormat = "[$-40C]d-mmm-yy;@"
'donne à la variable "q" le nombre de lignes utilisées dans la feuille MàJ
Range("B2").Select
line10:
If Range("B2").Value <> "" Then
GoTo line11
Else
GoTo line12
line11:
q = Selection.Row
If Range("B" & q + 1).Value <> "" Then
Range("B" & q + 1).Select
GoTo line10
End If
line12:
End If
'traitement des dates de modifications
For s = 2 To q
Range("L" & s).FormulaR1C1 = "=LEFT(RC[-3],5)" 'extrait les 5 1er caractères de la colonne "modifié le" et les colle en colonne "L"
Range("M" & s).FormulaR1C1 = "=LEFT(RC[-1],2)" 'extrait les 2 1er caractères de la colonne "L" et les colle en colonne "M"
Range("N" & s).FormulaR1C1 = "=RIGHT(RC[-2],2)" 'extrait les 2 derniers caractères de la colonne "L" et les colle en colonne "N"
Range("O" & s).FormulaR1C1 = "=RIGHT(RC[-6],4)" 'extrait les 4 derniers caractères de la colonne "Modifié le" et les colle en colonne "O"
Range("T" & s).FormulaR1C1 = "=DATE(RC[-5],RC[-6],RC[-7])" 'Traduit la date de modification au bon format dans la colonne "T"
'traitement des dates de créations
Range("P" & s).FormulaR1C1 = "=LEFT(RC[-6],5)" 'extrait les 5 1er caractères de la colonne "Crée le" et les colle en colonne "P"
Range("Q" & s).FormulaR1C1 = "=LEFT(RC[-1],2)" 'extrait les 2 1er caractères de la colonne "P" et les colle en colonne "Q"
Range("R" & s).FormulaR1C1 = "=RIGHT(RC[-2],2)" 'extrait les 2 derniers caractères de la colonne "P" et les colle en colonne "R"
Range("S" & s).FormulaR1C1 = "=RIGHT(RC[-9],4)" 'extrait les 4 derniers caractères de la colonne "crée le" et les colle en colonne "S"
Range("U" & s).FormulaR1C1 = "=DATE(RC[-2],RC[-3],RC[-4])" 'Traduit la date de création au bon format dans la colonne "U"
Next
'remplace les dates dans l'ABAP
Range("T2" & ": U" & q).Select
Selection.Copy
Range("I2").Select
Application.Run "'Tableau de suivi des Ncr.xls'!Collage_spécial"
'copier les cloturés depuis OUVERTS
Sheets("Ouverts").Select
Selection.AutoFilter Field:=1, Criteria1:="="
Sheets("Ouverts").Select
Range("B1:M1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
'Coller les clôturés au fond de la feuille CLOTURES
Sheets("Clôturés").Select
Range("A1").Select
Selection.End(xlDown).Select
num_ligne = Selection.Row + 1
Range("A" & Selection.Row + 1).Select
x = 0
y = Selection.Row
Application.Run "'Tableau de suivi des Ncr.xls'!Collage_spécial"
'Supprimer la ligne de titres
Rows(num_ligne).Select
Selection.Delete
'Modifie les dates de modifications des nouveaux clôturés
line1:
If Range("I" & y).Value <> "" Then
GoTo line2
Else
GoTo Line3
End If
line2:
Range("H" & y).Value = Date
Range("H" & y).Select
x = x + 1
y = y + 1
GoTo line1
'Retourne à la 1ère ligne des nouveaux clôturés
Line3:
x = x - 1
Range("I" & Selection.Row - x).Select
'Déplace les commentaires des clôturés
Range("K" & Selection.Row).Select
Range("K" & Selection.Row & ": K" & Selection.Row + x).Select
Selection.Copy
Range("O" & Selection.Row).Select
Application.Run "'Tableau de suivi des Ncr.xls'!Collage_spécial"
'Ecrit la date de clôture dans les commentaires
Range("K" & Selection.Row & ": K" & Selection.Row + x).Select
Selection.NumberFormat = """Clôturé le ""[$-40C]d-mmm-yy;@"
Selection.Value = Date
'Ecrit les dates de clôture dans la colonne de calcul
t = 0
Range("N" & Selection.Row).Select
line4:
If Range("L" & Selection.Row).Value <> "" Then
Selection.Value = Date
Range("N" & Selection.Row + 1).Select
t = t + 1
If t <= x Then GoTo line4
Else
Selection.Value = "----------------"
Range("L" & Selection.Row).Value = "----------------"
Range("N" & Selection.Row + 1).Select
t = t + 1
If t <= x Then GoTo line4
End If
Range("N" & Selection.Row - x - 1).Select
'Actualiser calculs
Calculate
'Supprimer les cloturés dans feuille OUVERTS
Sheets("Ouverts").Select
For i = 2 To 1000
If Range("A" & 1002 - i) = "" Then
If Range("O" & 1002 - i).Value <> "" Then Rows(1002 - i).Delete
End If
Next
'Actualiser calculs
Calculate
'copier les nouveaux ouverts depuis MàJ JOURNALIERE
Sheets("Ouverts").Select
Selection.AutoFilter Field:=1
Sheets("(MàJ journalière)").Select
Selection.AutoFilter Field:=1, Criteria1:="="
Sheets("(MàJ journalière)").Select
Range("B1:K1").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
'Coller les Nouveaux ouverts au fond de la feuille OUVERTS
Sheets("Ouverts").Select
Range("B1").Select
Selection.End(xlDown).Select
num_ligne = Selection.Row + 1
Range("B" & Selection.Row + 1).Select
Application.Run "'Tableau de suivi des Ncr.xls'!Collage_spécial"
'Supprimer la ligne de titres
Rows(num_ligne).Select
Selection.Delete
'Remplacer les "." par des "/" dans les dates des nouvreaux NCR
Columns("I:J").Select
Selection.NumberFormat = "[$-40C]d-mmm-yy;@"
Selection.Replace What:=".", Replacement:="/", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
'Actualiser calculs
Calculate
'Supprimer les cloturés dans feuille OUVERTS
Sheets("Ouverts").Select
For i = 2 To 1000
If Range("O" & 1002 - i).Value <> "" Then Rows(1002 - i).Delete
Next
'Actualiser calculs
Calculate
'reclasse la feuille OUVERT par ordre croissant
Range("A1:O865").Sort Key1:=Range("B1"), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
'Nettoyage de la feuille MàJ JOURNALIERE
Sheets("(MàJ journalière)").Select
ActiveSheet.ShowAllData
Range("B2:U2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
Range("B2").Select
'Actualisation des Database et des Graphiques
Sheets("Database1").Select
Range("A2:C2").Select
Selection.AutoFill Destination:=Range("A2:C1000")
Range("A2:C1000").Select
'Actualiser calculs
Calculate
Sheets("Répartition des NCR par dates").Select
ActiveChart.PivotLayout.PivotTable.RefreshTable
Sheets("Répartion des NCR par services").Select
ActiveChart.PivotLayout.PivotTable.RefreshTable
Sheets("Ouverts").Select
GoTo line53
line50: 'message d'annulation de la macro car test de départ non concluant
MsgBox ("Importer d'abord l'ABAP de SAP avant de lancer la macro")
MsgBox ("Macro annulée")
GoTo line53
line53:
Sheets("Ouverts").Select
Range("B2").Select
Range(Selection, Selection.End(xlDown)).Copy
Open "C:\Documents and Settings\lopesc\Desktop\SAP_Temp.txt" For Output As #1
Print #1, , ClipBoard.GetText
Close #1
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 15 nov. 2007 à 00:02
Renfield avait la bonne solution... encore...
Par contre le Clipboard n'est pas disponible en VBA comme il l'est en VB.
Essaie ceci
Dans un module, copie ceci (ça ne vient pas de moi, mais bon...)
Option Explicit
' API pour utiliser le ClipBoard
Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
Declare Function CloseClipboard Lib "User32" () As Long
Declare Function GetClipboardData Lib "User32" (ByVal wFormat As Long) As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096
' Fonction pour utiliser le Clipboard
Function ClipBoard_GetData()
Dim hClipMemory As Long
Dim lpClipMemory As Long
Dim MyString As String
Dim RetVal As Long
If OpenClipboard(0&) = 0 Then
MsgBox "Cannot open Clipboard. Another app. may have it open"
Exit Function
End If
' Obtain the handle to the global memory block that is referencing the text.
hClipMemory = GetClipboardData(CF_TEXT)
If IsNull(hClipMemory) Then
MsgBox "Could not allocate memory"
GoTo OutOfHere
End If
' Lock Clipboard memory so we can reference the actual data string.
lpClipMemory = GlobalLock(hClipMemory)
If Not IsNull(lpClipMemory) Then
MyString = Space$(MAXSIZE)
RetVal = lstrcpy(MyString, lpClipMemory)
RetVal = GlobalUnlock(hClipMemory)
' Peel off the null terminating character.
' MyString = Mid(MyString, 1, InStr(1, MyString, Chr$(0), vbBinaryCompare) - 1)
MyString = Left(MyString, Len(MyString) - 1)
Else
MsgBox "Could not lock memory to copy string from."
End If
whitelegend030
Messages postés23Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention 1 février 2010 15 nov. 2007 à 08:09
j'ai un peu de mal à comprendre je colle ces 2 codes dans 2 modules différents ? et je ne me sert que du second ?
de toutes facons quand j'éxécute le second module ca a pour effet de fermer mon classeur, quand je veux je re ouvrir excel me propose des versions récupérées suite à un plantage, et si je veux ouvrir mon original je ne peux pas car il est en lecture seul apparement bloqué par moi même ...
désolé de ne pas comprendre aussi rapidement que vous le souhaiteriez mais je suis réellement novice dans les macros je ne fait que me lancer dedans. La macro que j'ai posté ci-dessus est ma toute 1ère.
Dim oClipboard As DataObject
Open "C:\Documents and Settings\lopesc\Desktop\SAP_Temp.txt" For Output As #1
Set oClipboard = New DataObject
oClipboard.GetFromClipboard
Print #1, , oClipboard.GetText
Close #1
whitelegend030
Messages postés23Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention 1 février 2010 15 nov. 2007 à 16:52
voila la macro que j'ai faite pour tester :
Sub test()
Range("D2:D15").Copy
Dim oClipboard As DataObject
Open "C:\Documents and Settings\lopesc\Desktop\SAP_Temp.txt" For Output As #1
Set oClipboard = New DataObject
oClipboard.GetFromClipboard
Print #1, , oClipboard.GetText
Close #1
whitelegend030
Messages postés23Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention 1 février 2010 16 nov. 2007 à 08:05
Sub test()
Range("D2:D15").Copy
Dim oClipboard As DataObject Open "C:\Documents and Settings\lopesc\Desktop\SAP_Temp.txt" For Output As #1
Set oClipboard = New DataObject
oClipboard.GetFromClipboard
Print #1, , oClipboard.GetText
Close #1
End Sub
ca coince ici.
MPi je suis assez novice dans ce domaine, donc pour moi le: "
Pour utiliser le DataObject, il faut que tu références Forms 2.0" c'est pas encore du chinois mais au moins du javanais... :p
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 17 nov. 2007 à 14:35
Et pour le code que j'ai mis avec les APIs, c'est cette procédure que tu dois appeler
CopierCollerRangeDansFichier
Mets le code de cette procédure dans le code d'une feuille et assure-toi que cette feuille est active et contient des données à copier.
Si tu mets le code dans un module, il faudrait éventuellement ajouter ActiveSheet ou le nom explicite de la feuille Sheets("Feuil1") avant les mots Range, Cells, ...
L'autre partie va dans un module standard (.bas), pas module de classe (.cls)
Et n'appelle rien dans cette partie, le code de CopierCollerRangeDansFichier va s'en charger.
whitelegend030
Messages postés23Date d'inscriptionmardi 13 novembre 2007StatutMembreDernière intervention 1 février 2010 19 nov. 2007 à 08:21
Tout compte fait un petit truc que je croyais pratique au départ se révèle vachement difficile T_T
Je vois, MPi, que tu as fait pleins d'efforts pour m'expliquer le plus simplement possible, mais le problème c'est que je suis encore plus novice que ca.... donc ( .bas) ou (.cls) ben la deja je susi perdu.
C'est dommage qu'il n'y ai pas de code tout simple dans VB comme un copier/coller ... xD