Obtention des cellules qui comportent des liens vers d'autres classeurs en VBA

bloublou

XLDnaute Occasionnel
Bonjour à tous,

J'aurai besoin de votre aide pour une question de méthode et/ou de code vba

J'ai récupéré bcp de fichiers avec en général 10 feuilles.
Sur chaque feuille j'ai des tableaux, (jusque là tout va bien :rolleyes:) mais j'ai plusieurs types de données :
cellules avec des valeurs brutes / formules / liens sur d'autres classeurs


Comme les tableaux sont assez importants, je voudrais récupérer les cellules dans un premier temps qui ont des liens vers d'autres fichiers
Ca m'évite de faire control + F3 sur toutes les pages et c'est pas tellement lisible :mad:

Et dans un 2ieme temps sur un autre feuille, je souhiaterais obtenir, sur le même principe, que les cellules qui sont en "dur", qui ne comportent pas de formules ni de liens

Je pourrais contrôler rapidement les erreurs possible de Mise à jour de fichiers :cool:

J'ai raisonné comme cela mais peut etre avez vous d'autres méthodes qui seraient plus simplesà mises en oeuvre ? :confused:

D'avance

Merci

BlouBlou
 

Pièces jointes

  • Macro.xlsm
    14.2 KB · Affichages: 29
  • Macro.xlsm
    14.2 KB · Affichages: 31
  • Macro.xlsm
    14.2 KB · Affichages: 31

Staple1600

XLDnaute Barbatruc
Re : Obtention des cellules qui comportent des liens vers d'autres classeurs en VBA

Bonsoir à tous

bloublou
Avant toute chose, as-tu fais des recherches sur le net (ou dans les archives du forum) ?
Je viens de le faire sur le net, et 20 secondes plus tard, je modifiais ceci dans mon VBE...:rolleyes:

Je te laisse dond faire la recherche pour ce point-ci :
Et dans un 2ieme temps sur un autre feuille, je souhiaterais obtenir, sur le même principe, que les cellules qui sont en "dur", qui ne comportent pas de formules ni de liens
Le résultat devrait là aussi être assez rapide ;)
VB:
Sub ShowAllLinksInfo()
'Author:        JLLatham
'Purpose:       Identify which cells in which worksheets are using Linked Data
'Requirements:  requires a worksheet to be added to the workbook and named LinksList
'Modified From: [url=http://answers.microsoft.com/en-us/office/forum/office_2007-excel/workbook-links-cannot-be-updated/b8242469-ec57-e011-8dfc-68b599b31bf5?page=1&tm=1301177444768]Workbook links cannot be updated... - Microsoft Community[/url]
    Dim i%, nextReportRow&, shtName$, aLinks, anyCell  As Range
    Dim Ws               As Worksheet
    Dim anyWS            As Worksheet
    Dim reportWS         As Worksheet
    
    shtName = "LinksList"
 
    'Create the result sheet if one does not already exist
    For Each Ws In Application.Worksheets
        If Ws.Name = shtName Then bWsExists = True
    Next Ws
    If bWsExists = False Then
        Application.DisplayAlerts = False
        ActiveWorkbook.Worksheets.Add(Type:=xlWorksheet).Name = shtName
        ActiveSheet.Move After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count)
        Application.DisplayAlerts = True
    End If
 
    'Now start looking of linked data cells
    Set reportWS = ThisWorkbook.Worksheets(shtName)
    reportWS.Cells.Clear
    reportWS.Range("A1:C1") = Array("Feuille", "Cellule", "Formule")
    
    aLinks = ActiveWorkbook.LinkSources(xlExcelLinks)
    If Not IsEmpty(aLinks) Then
        'there are links somewhere in the workbook
        For Each anyWS In ThisWorkbook.Worksheets
            If anyWS.Name <> reportWS.Name Then
                For Each anyCell In anyWS.UsedRange
                    If anyCell.HasFormula Then
                        If InStr(anyCell.Formula, "[") > 0 Then
                            nextReportRow = reportWS.Range("A" & Rows.Count).End(xlUp).Row + 1
                            reportWS.Range("A" & nextReportRow) = anyWS.Name
                            reportWS.Range("B" & nextReportRow) = anyCell.Address
                            reportWS.Range("C" & nextReportRow) = "'" & anyCell.Formula
                        End If
                    End If
                Next    ' end anyCell loop
            End If
        Next    ' end anyWS loop
    Else
        MsgBox "Aucune liaison détectée avec des classeurs externes.", vbCritical, "Informations"
    End If
    'housekeeping
    Set reportWS = Nothing
    Set Ws = Nothing
End Sub
 

Staple1600

XLDnaute Barbatruc
Re : Obtention des cellules qui comportent des liens vers d'autres classeurs en VBA

[... SUITE...]


Quoique de mon premier post, on peut tirer cette variation
(ce qui nous d'une pierre deux coups ;) )
VB:
Sub AdressesCellulesSansFormules()
'Variation de Staple1600 sur ShowAllLinksInfo (de JLLatham)
    Dim i%, nextReportRow&, shtName$, aLinks, anyCell  As Range
    Dim Ws               As Worksheet
    Dim anyWS            As Worksheet
    Dim reportWS         As Worksheet
    shtName = "RawDatas"
    'Create the result sheet if one does not already exist
    For Each Ws In Application.Worksheets
        If Ws.Name = shtName Then bWsExists = True
    Next Ws
    If bWsExists = False Then
        Application.DisplayAlerts = False
        ActiveWorkbook.Worksheets.Add(Type:=xlWorksheet).Name = shtName
        ActiveSheet.Move After:=ActiveWorkbook.Worksheets(ActiveWorkbook.Worksheets.Count)
        Application.DisplayAlerts = True
    End If
 
    'Now start looking of linked data cells
    Set reportWS = ThisWorkbook.Worksheets(shtName)
    reportWS.Cells.Clear
    reportWS.Range("A1:B1") = Array("Feuille", "Cellule")
    
        For Each anyWS In ThisWorkbook.Worksheets
            If anyWS.Name <> reportWS.Name Then
            On Error Resume Next
                For Each anyCell In anyWS.UsedRange.SpecialCells(xlCellTypeConstants, 3)
                    If Len(anyCell) > 0 Then
                            nextReportRow = reportWS.Range("A" & Rows.Count).End(xlUp).Row + 1
                            reportWS.Range("A" & nextReportRow) = anyWS.Name
                            reportWS.Range("B" & nextReportRow) = anyCell.Address(0, 0)
                    End If
                Next    ' end anyCell loop
            End If
        Next    ' end anyWS loop
    'housekeeping
    Set reportWS = Nothing
    Set Ws = Nothing
End Sub
 

bloublou

XLDnaute Occasionnel
Re : Obtention des cellules qui comportent des liens vers d'autres classeurs en VBA

Bonsoir le Fourm, staple1600,

Oui j'avais fait une recherche sur le forum, quoique un peu rapide peut etre :)
Oulaaa c'est tout en anglais :D

Je vais regarder tout ça

Merci en tout cas

Bonne nuit

BlouBlou
 

bloublou

XLDnaute Occasionnel
Re : Obtention des cellules qui comportent des liens vers d'autres classeurs en VBA

Bonjour le forum, staple1600,
Encore une question sur ta proposition de code sur la macro AdresseCellulesansformules :

Si je veux modifier ton code pour simplement executer la macro sur les cellules selectionnées et obtenir le résultat dans un msgbox, il faut que je modifie comme ceci ? :

Sub test()
'Variation de Staple1600 sur ShowAllLinksInfo (de JLLatham)
Dim i%, nextReportRow&, shtName$, aLinks, anyCell As Range
Dim Ws As Worksheet
Dim anyWS As Worksheet
Dim reportWS As Range

For Each anyCell In ActiveCell.CurrentRegion.SpecialCells(xlCellTypeConstants, 3)
If Len(anyCell) > 0 Then
nextReportRow = reportWS.Range("A" & Rows.Count).End(xlUp).Row + 1
reportWS.Range("A" & nextReportRow) = anyWS.Name
reportWS.Range("B" & nextReportRow) = anyCell.Address(0, 0)
MsgBox reportWS
End If
Next ' end anyCell loop

' end anyWS loop
'housekeeping
Set reportWS = Nothing
Set Ws = Nothing
End Sub

En fait j'ai un souci ca ne marche pas, je pense qu'il faut que je definisse le resultat en variable, pour l'afficher en msgbox ? :confused:

Merci de ton aide

BlouBlou
 

Staple1600

XLDnaute Barbatruc
Re : Obtention des cellules qui comportent des liens vers d'autres classeurs en VBA

Bonsoir à tous


bloulou
Si j'étais moi, j'éviterai l'emploi d'un MsgBox ;)
Pourquoi ?
Eh, bien testes cette macro (avec au moins 65 cellules non vides)
Code:
Sub testII()
Dim anyCell As Range, anyWS As Worksheet, RESULTS$
For Each anyWS In ThisWorkbook.Worksheets
For Each anyCell In anyWS.UsedRange.SpecialCells(xlCellTypeConstants, 3)
If Len(anyCell) > 0 Then
RESULTS = RESULTS & anyWS.Name & ": " & anyCell.Address(0, 0) & Chr(13)
End If
Next
Next
MsgBox Space(35) & Chr(13) & RESULTS, vbInformation, "Mauvaise idée, la MsgBox ;-)"
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
312 214
Messages
2 086 311
Membres
103 175
dernier inscrit
abcc