Microsoft 365 Traiter un fichier CSV qui est ouvert

  • Initiateur de la discussion Initiateur de la discussion gsx-air
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

gsx-air

XLDnaute Nouveau
Bonjour à tous
je butte sur un problème
j'utilise un logiciel qui me permet de générer des nomenclatures de pièces en cliquant sur un bouton export cela m'ouvre un fichier CSV dans EXCEL
aujourd'hui, je copie colle les infos que j'ai besoin dans un fichier Excel avec macro qui me permet de générer des exports dans différent format vers différents services, mais c'est plutôt fastidieux
je souhaite donc automatiser ce copier-coller, mais je n'arrive pas à trouver via le VBA ce fichier CSV qui est ouvert
ce fichier est un fichier temporaire puisque non-enregistrer (le fichier s'appelle tmp1 le suivant tmp2 .... et Excel me dit "emplacement temp"

j'ai testé ceci
VB:
Function NomAutreClasseur() As String
Dim Wkb As Workbook
    NomClasseur = ""
    For Each Wkb In Application.Workbooks
        If Left(Wkb.Name, 3) = "tmp" Then
            NomClasseur = Wkb.Name
            Exit For
        End If
    Next Wkb
End Function

cela fonctionne si j'ouvre plusieurs fichiers Excel, mais je ne trouve pas mon CSV
autre point, mon fichier CSV est ouvert dans une autre application Excel (lorsque j'ouvre mon gestionnaire de tache, j'ai un Excel avec en dessous tous les fichiers ouvert et un autre Excel avec en dessous le fichier CSV)

j'ai testé un bouton macro dans le ruban, là cela fonctionne presque, (si mon fichier macro est déjà ouvert cela me le rouvre dans la seconde appli Excel) mais cela m'obligerait à installer une barre d'outils sur plusieurs postes et je souhaiterais éviter cela

si quelqu'un a une piste, je suis preneur
je pense que le problème vient du fait que j'ai deux applis Excel d'ouvertes
qu'en pensez-vous
Merci de votre aide.
 
Solution
Bonjour à tous
j'ai trouvé une solution avec le code suivant
je dois être franc, je ne maitrise pas ce code (récup du net)
je l'ai adapté et cela fonctionne
soyez indulgent mes modifs sont peut-être un peu brouillon
encore merci pour le temps passé 😉✌



VB:
Option Explicit

  Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
  (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
  Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" _
  (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
  Declare PtrSafe Function IIDFromString Lib "ole32" (ByVal lpsz As LongPtr, ByRef lpiid As UUID) As Long
  Declare PtrSafe Function...
Re,

J'entends bien que d'autres fichiers sont ouverts

Mais tu nous dis bien "aujourd'hui, je copie colle les infos que j'ai besoin dans un fichier Excel avec macro qui me permet de générer des exports dans différent format vers différents services, mais c'est plutôt fastidieux"

Donc ce fameux fichier Excel ou tu colles les données, pourquoi ne pas l'ouvrir depuis le fichier "temp1.csv" 🤔

Bon après si tu ne veux pas faire autrement que ton habitude 🙄
Perso, j'arrête là ma tentative d'aide avec toi

Bonne continuation
Salut
J'ai testé également, mais si mon fichier est déjà ouvert dans la première instance, il se reouvre en lecture seule dans la seconde instance, donc cela oblige la personne à fermer le fichier avant de lancer la macro depuis le CSV. Et si je lance la macro depuis la seconde instance, je n'arrive pas via une Macro a fermé un fichier de la première instance
en tout cas je vous remercie du temps que vous m'avez accordé
je vais réfléchir à une solution moins automatisée, mais comme les deux fichiers étaient ouverts, je pensais qu'il y avait une solution
je vous tiendrai informé si solution trouvée ou pas
Merci
 
Bonjour à tous
j'ai trouvé une solution avec le code suivant
je dois être franc, je ne maitrise pas ce code (récup du net)
je l'ai adapté et cela fonctionne
soyez indulgent mes modifs sont peut-être un peu brouillon
encore merci pour le temps passé 😉✌



VB:
Option Explicit

  Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
  (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
  Declare PtrSafe Function GetClassName Lib "user32" Alias "GetClassNameA" _
  (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
  Declare PtrSafe Function IIDFromString Lib "ole32" (ByVal lpsz As LongPtr, ByRef lpiid As UUID) As Long
  Declare PtrSafe Function AccessibleObjectFromWindow Lib "oleacc" _
  (ByVal hwnd As Long, ByVal dwId As Long, ByRef riid As UUID, ByRef ppvObject As Object) As Long

Type UUID 'GUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(7) As Byte
End Type

Const IID_IDispatch As String = "{00020400-0000-0000-C000-000000000046}"
Const OBJID_NATIVEOM As Long = &HFFFFFFF0

Sub GetAllWorkbookWindowNames()
On Error GoTo MyErrorHandler
Dim hWndMain As Long

hWndMain = FindWindowEx(0&, 0&, "XLMAIN", vbNullString)

Do While hWndMain <> 0
  GetWbkWindows hWndMain
  hWndMain = FindWindowEx(0&, hWndMain, "XLMAIN", vbNullString)
Loop
Exit Sub

MyErrorHandler:
  MsgBox "GetAllWorkbookWindowNames" & vbCrLf & vbCrLf & "Err = " & Err.Number & vbCrLf & "Description: " & Err.Description
End Sub

Private Sub GetWbkWindows(ByVal hWndMain As Long)
  On Error GoTo MyErrorHandler

  Dim hWndDesk As Long
  hWndDesk = FindWindowEx(hWndMain, 0&, "XLDESK", vbNullString)

  If hWndDesk <> 0 Then
    Dim hwnd As Long
    hwnd = FindWindowEx(hWndDesk, 0, vbNullString, vbNullString)

    Dim strText As String
    Dim lngRet As Long
    
    Do While hwnd <> 0
      strText = String$(100, Chr$(0))
      lngRet = GetClassName(hwnd, strText, 100)

      If Left$(strText, lngRet) = "EXCEL7" Then
        GetExcelObjectFromHwnd hwnd
        Exit Sub
      End If

      hwnd = FindWindowEx(hWndDesk, hwnd, vbNullString, vbNullString)
    Loop

    On Error Resume Next
  End If

  Exit Sub

MyErrorHandler:
  MsgBox "GetWbkWindows" & vbCrLf & vbCrLf & "Err = " & Err.Number & vbCrLf & "Description: " & Err.Description
End Sub

Public Function GetExcelObjectFromHwnd(ByVal hwnd As Long) As Boolean
  On Error GoTo MyErrorHandler

  Dim fOk As Boolean
  Dim test As String
  fOk = False

  Dim iid As UUID
  Call IIDFromString(StrPtr(IID_IDispatch), iid)

  Dim obj As Object
  Dim myWorkbook As Workbook
  Dim myWorksheet As Worksheet
  If AccessibleObjectFromWindow(hwnd, OBJID_NATIVEOM, iid, obj) = 0 Then 'S_OK
    Dim objApp As Excel.Application
    Set objApp = obj.Application
    Debug.Print objApp.Workbooks(1).Name
        
        If Left(objApp.Workbooks(1).Name, 3) = "tmp" And Right(objApp.Workbooks(1).Name, 4) = ".csv" Then
       Set myWorksheet = objApp.Workbooks(1).Worksheets(1)

        myWorksheet.Range("a1:l80").Copy
        Worksheets("tmp").Range("a1").PasteSpecial Paste:=xlPasteValues
        objApp.CutCopyMode = False
        objApp.Workbooks(1).Close
        objApp.Quit
      End If
    fOk = True
  End If

  GetExcelObjectFromHwnd = fOk

  Exit Function

MyErrorHandler:
  MsgBox "GetExcelObjectFromHwnd" & vbCrLf & vbCrLf & "Err = " & Err.Number & vbCrLf & "Description: " & Err.Description
End Function
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

D
  • Question Question
2
Réponses
28
Affichages
1 K
Deleted member 441486
D
Réponses
40
Affichages
2 K
Réponses
8
Affichages
658
Réponses
10
Affichages
491
Retour