Scuola forum (scuo.la) - Forum di discussione per le scuole

Scuola forum (scuo.la) - Forum di discussione per le scuole (https://www.scuolaforum.org/)
-   Informatica (https://www.scuolaforum.org/informatica/)
-   -   Macro per scorrere e analizzare colonna contenente indirizzi internet (https://www.scuolaforum.org/informatica/193-macro-per-scorrere-e-analizzare-colonna-contenente-indirizzi-internet.html)

Scuola 10-15-2007 10:35 PM

Macro per scorrere e analizzare colonna contenente indirizzi internet
 
Salve,
è tanto che rimando l'analisi di questo difficile problema Excel, ma ora sono deciso nel trovarne la soluzione, se possibile.

Dunque, possiedo un foglio di calcolo con in colonna C un elenco di link internet in ordine alfabetico (con indirizzo completo di http) ed in D, E, F, dei dati che però non ci interessano: ci interessa solo sapere quando nella colonna D vi è una cella vuota.

Infatti io dovrei creare una macro che scorra tutta la colonna D e intervenga quando trova una cella vuota. Quando la trova supponiamo in D8, deve controllare se la cella C7 e C9 possiede lo stesso dominio della cella C8 (che sarà quindi affiancata alla D8).

Per stesso dominio, si intende un indirizzo web fino al primo slash ( / ) ed il resto non conta.
(NB: non il doppio slash// ma solo il singolo/)

Ad esempio questi vanno considerati tutti uguali perchè possiedono la stessa radice http://www.excel.com/

codice:

  http://www.excel.com/newthread.php
  http://www.excel.com/index.html
  http://www.excel.com/office/index.html

Questi invece vanno considerati diversi perchè appunto cambia la radice:

codice:

  http://www.word.com/newthread.php
  http://www.new.excel.com/index.html
  http://www.excel.it/office/index.html

Quindi alla fine bisogna controllare la stringa dall'inizio e fino alla singola /.

Una volta fatto questo, poniamo che l'indirizzo in C7 sia uguale a C8, deve semplicemente copiare le 3 celle D7:F7 in D8:F8. (Potrebbe essere uguali tutti e 3 i C7, C8 e C9 ma sarebbe indifferente quale copiare, basta che non dia errore la funzione).

Se invece l'indirizzo C8 non fosse uguale a nient'altro, basterebbe far proseguire la macro senza fare niente fino alla prossima cella vuota, e così via fino alla fine.

Come ultima complicazione, le celle vuote potrebbero anche essere 2 o più attaccate: in questo caso bisogna prima eliminare i doppioni controllando sempre il dominio seguendo il sistema di prima.

Lo so, è un casino e andrebbe fatto un passo alla volta, solo che il foglio è già pieno di formule e altre macro (che non ho creato io...) e quindi sarebbe un problema andare a spostare le colonne o aggiungerne, perchè dopo potrebbe non funzionare qualcos'altro.

Non so bene quanto possa essere difficile per un buon programmatore, ma confido che un guru possa risolvere la questione con poche righe di codice.
Gliene sarei tanto grato...! ;-)

Grazie mille

Black 10-30-2007 03:56 PM

Non ho capito bene come vuoi copiare i valori, ma ti consiglierei di fare tutto in un foglio esterno collegato per non spostare niente. Scrivendo macro faresti una cosa ancora più complicata di difficile mantenimento.

Le funzioni che ti servono sono sicuramente tra quelle di testo:
  1. Trova() (da l'ordinale dell'n-sima ricorrenza di un carattere)
  2. Sinistra () Destra() Stringa.estrai() per creare la stringa
  3. & che fa da concatenatore di testo
Insieme al classico SE() ed agli operatori logici E() ed O():ciaociao:

Scuola 10-31-2007 01:04 PM

Quote:

Originariamente inviata da Black (Messaggio 1748)
Non ho capito bene come vuoi copiare i valori, ma ti consiglierei di fare tutto in un foglio esterno collegato per non spostare niente. Scrivendo macro faresti una cosa ancora più complicata di difficile mantenimento.

Le funzioni che ti servono sono sicuramente tra quelle di testo:
  1. Trova() (da l'ordinale dell'n-sima ricorrenza di un carattere)
  2. Sinistra () Destra() Stringa.estrai() per creare la stringa
  3. & che fa da concatenatore di testo
Insieme al classico SE() ed agli operatori logici E() ed O():ciaociao:

Il problema è che questo foglio viene riordinato, alcune celle vengono eliminate ed altre aggiunte... con le formule si incasina poi tutto.
Devo fare per forza una macro che quando viene lanciata fa solo quello e nient'altro.
Grazie comunque

Scuola 11-03-2007 05:55 PM

Bene, alla fine grazie ai gruppi ufficiali usenet sono riuscito a risolvere così:

codice:

Public Sub CercaVuoteSopra() 'trova le vuote nell'intervallo
Dim rngIn As Range

Set rngIn = Range(Range("A1"), Range("A1").End(xlDown)).Offset(, 3)
Dim rngVuota As Range
With rngIn
For i = 1 To rngIn.Cells.Count
  Set rngVuota = rngIn.Cells(i).Find(What:="", _
    SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not rngVuota Is Nothing Then
 rngVuota.Select
  If GetDomain(rngVuota.Offset(0, -1)) = GetDomain(rngVuota.Offset(-1, -1)) Then

    ActiveCell.Offset(-1, 0).Range("A1:C1").Select
    Application.CutCopyMode = False
    Selection.Copy
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveSheet.Paste
   
  End If: End If
  Next i
  End With
  Set rngIn = Nothing
  Set rngVuota = Nothing
End Sub
Public Sub CercaVuoteSotto() 'trova le vuote nell'intervallo
Dim rngIn As Range

Set rngIn = Range(Range("A1"), Range("A1").End(xlDown)).Offset(, 3)
Dim rngVuota As Range
With rngIn
For i = 1 To rngIn.Cells.Count
  Set rngVuota = rngIn.Cells(i).Find(What:="", _
    SearchOrder:=xlByRows, SearchDirection:=xlNext)
If Not rngVuota Is Nothing Then
 rngVuota.Select
  If GetDomain(rngVuota.Offset(0, -1)) = GetDomain(rngVuota.Offset(1, -1)) Then

    ActiveCell.Offset(1, 0).Range("A1:C1").Select
    Application.CutCopyMode = False
    Selection.Copy
    ActiveCell.Offset(-1, 0).Range("A1").Select
    ActiveSheet.Paste
   
  End If: End If
  Next i
  End With
  Set rngIn = Nothing
  Set rngVuota = Nothing
End Sub

Private Function GetDomain(Stringa)
    Dim oRegExp As Object, strTemp As String
    Dim oMatches  As Object
    Set oRegExp = CreateObject("vbscript.RegExp")
    With oRegExp
        .IgnoreCase = False
        .Global = True
    End With
    oRegExp.Pattern = "^(?:[^/]+://)?([^/:]+/)"
    Set oMatches = oRegExp.Execute(Stringa)
    For Each oMatches In oMatches
        strTemp = strTemp & oMatches.Value
    Next
    Set oRegExp = Nothing
    GetDomain = strTemp
End Function

Poi ho creato una quarta macro che lancia 3 volte la prima e 3 volte la seconda (questo perchè le celle vuote possono anche essere 2-3 di fila) facendo disattivare l'aggiornamento dello schermo per velocizzare la cosa.
Grazie a tutti per l'aiuto!:ciaociao:


Tutti gli orari sono GMT +2. Attualmente sono le 07:53 AM.