Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [Excel] Problema con macro x calcolo combinazioni

    Salve, il mio problema è questo:
    dall'immagine d'esempio che ho allegato e che si trova anche all'indirizzo
    http://img190.imageshack.us/img190/2699/esempioy.jpg
    vedrete che ho diverse colonne ognuna delle quali con un gruppo di oggetti.
    Spulciando in rete ho trovato una macro che fa al caso mio, solo che una volta modificata per le mie esigenze, ha funzionato con 4 colonne ma ora che ne ho aggiunta un'altra, mi continua ad andare in crash excel e mi compare la scritta Metodo "End" dell'oggetto Range non riuscito
    Non sono più riuscito a risalire al creatore della macro,per cui ora chiedo aiuto a voi..

    Quello che voglio io è che mi venga restituito nel foglio2 tutte le combinazioni possibili (si lo so che potrebbero essere decine e decine di migliaia a seconda del numero di oggetti...ma questo è quello che mi serve..purtroppo..)
    La macro è la seguente:

    Sub macro3()
    Dim Ws1, Ws2 As Worksheet
    Set Ws1 = Worksheets("Foglio1")
    Set Ws2 = Worksheets("Foglio2")
    UC = 4
    UR = Ws1.Range("A" & Rows.Count).End(xlUp).Row
    UR2 = Ws2.Range("A" & Rows.Count).End(xlUp).Row
    Ws2.Range("A1:" & "E" & UR2).ClearContents
    For RR1 = 2 To UR
    For RR2 = 2 To UR
    For RR3 = 2 To UR
    For RR4 = 2 To UR
    For RR5 = 2 To UR
    Titolo1 = Ws1.Cells(RR1, 1).Value
    Titolo2 = Ws1.Cells(RR2, 2).Value
    Titolo3 = Ws1.Cells(RR3, 3).Value
    Titolo4 = Ws1.Cells(RR4, 4).Value
    Titolo5 = Ws1.Cells(RR5, 5).Value
    Ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Titolo1
    Ws2.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Value = Titolo2
    Ws2.Cells(Rows.Count, 3).End(xlUp).Offset(1, 0).Value = Titolo3
    Ws2.Cells(Rows.Count, 4).End(xlUp).Offset(1, 0).Value = Titolo4
    Ws2.Cells(Rows.Count, 5).End(xlUp).Offset(1, 0).Value = Titolo5
    Next RR5
    Next RR4
    Next RR3
    Next RR2
    Next RR1
    End Sub

    Nella mia ignoranza... il valore UC è il numero massimo di oggetti che si possono combinare assieme?
    Io comunque ho anche impostato a 5, ma il crash rimane.

    Grazie in anticipo per chi si interesserà al mio problema!
    Immagini allegate Immagini allegate

  2. #2
    Ci aggiungo un file d'esempio
    http://uploading.com/files/c7441443/Combinazioni.xlsm/

    Ho messo 3 pulsanti macro:
    Uno combina le prime tre colonne, l'altro le prime 4 colonne. Ovviamente ci vogliono un bel pò di secondi affinchè excel termini le operazioni di calcolo..
    Poi c'è il terzo pulsante che dovrebbe combinare tutte e 5 le colonne... ma dopo 5/6 minuti excel è sempre piantato e bloccato e non ne esco fuori.
    Se per caso i pulsanti non funzionano, le macro che troverete sono appunto 3:
    Macro1= x le 3 colonne
    Macro2= x le 4 colonne
    Macro3= x le 5 colonne

  3. #3
    Utente di HTML.it L'avatar di nelsonblu
    Registrato dal
    Feb 2007
    Messaggi
    2,234
    la risposta è semplice, non c'è nessun errore nella macro 3.
    Semplicemente superi il numero massimo di righe possibili che in excel 2007 e 2010 è 1.048.576

    infatti già 16 righe viene 16^5=1.048.576righe +la prima riga vuota sei già out
    con 17 righe sei 17^5=1.419.857 righe outissimo

  4. #4
    In effetti un dubbio in tal senso me l'ero posto....
    Dovrei tirar fuori il mio vecchio libro di matematica e vedere se ci sto dentro con i dati che effettivamente mi servono.
    Mi spiego: l'esempio che ho allegato è estremamente estremo però in realtà al massimo la prima colonna avrà 17, la seconda sedici la terza 2, la quarta 4 e la quinta 2 o 3, non ricordo esattamente...
    Il problema è a me servirebbe che la macro in più non accetti le ripetizioni e non accetti (come combinazioni) le caselle vuote.
    Mi spiego:
    Se applichi la macro1 (3 colonne) in un progetto nel quale ci siano 4 oggetti nella prima colonna, 2 nella seconda e 2 nella terza, vedrai che la macro mi darà un risultato non corretto. Per ottenere l'esito voluto bastava sostituire le celle vuote con una "x" fino ad avere lo stesso numero di oggetti (4)per tutte e tre le colonne, poi eliminare (facilmente) nel foglio2 tutte le righe contenenti la x e il gioco era fatto..
    Purtroppo le mie capacità non arrivano a modificare la macro per ottenere questo automaticamente... quindi, nell'esempio sopracitato, invece di darmi subito le 16 combinazioni possibili me ne dà 64 (comprese le righe con le x)..figuriamoci con più oggetti per colonna..

  5. #5
    Utente di HTML.it L'avatar di nelsonblu
    Registrato dal
    Feb 2007
    Messaggi
    2,234
    Ciao, io ci posso provare ma purtroppo in access.
    Nel senso che leggerei i dati dal file di excel e lo farei elaborare dal vba di access.
    Il risultato sarebbe una tabella di access con tutte le combinazioni possibili escluse quelle con gli spazi e ognuna presa una sola volta.
    In access non ci sarebbero limiti nel numero di record che possono essere milioni.
    Poi la tabella è reimportabile tranquillamente in excel "a pezzi" se ci sono problemi di superamento di limiti.
    Se per te è uguale e non vai di fretta ci posso provare.
    Ovviamente sull'esito non ti assicuro niente ma non dovrebber essere per me complicato..

  6. #6
    Guarda, in tutta onestà ho chiesto delucidazioni sul da farsi a destra e a manca e c'è stato un'altra anima pia che mi ha dato una mano (come te ovviamente).
    Non so se sto facendo una scorrettezza - anche se non lo penso perchè non c'è nessun copyright che infrango - però per correttezza di chi legge questo thread, penso sia giusto mostrare la soluzione del problema che ho posto, anche se chi lo ha risolto...non sono io!
    Sottolineo comunque che il codice macro che trascriverò sotto NON è stato preso da un thread creato da altri, ma da uno creato sempre da me... solo in altri lidi. Spero che qualcuno non se ne abbia a male..

    Ecco il codice macro... ehm...però mi raccomando, io mi limito a trascriverla: non chiedetemi delucidazioni su di essa... vi posso dire che funziona alla grande!

    Sub Combinazioni5()
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet
    Dim C1 As Range, C2 As Range, C3 As Range, C4 As Range, C5 As Range
    Dim C1R As Range, C2R As Range, C3R As Range, C4R As Range, C5R As Range
    Dim NRiga As Long
    Dim Colonna As Long


    Set ws1 = ThisWorkbook.Sheets("Foglio1")
    Set ws2 = ThisWorkbook.Sheets("Foglio2")

    'Worksheets(1).Select
    With ws1
    Set C1 = .Range("A2:A18")
    Set C2 = .Range("B2:B18")
    Set C3 = .Range("C2:C18")
    Set C4 = .Range("D218")
    Set C5 = .Range("E2:E18")
    End With
    Colonna = 1
    'Worksheets(2).Select

    ws2.Range("a2:e" & Rows.Count) = ""
    'Application.EnableEvents = False
    For Each C1R In C1
    If C1R <> "" Then
    For Each C2R In C2
    If C2R <> "" Then
    For Each C3R In C3
    If C3R <> "" Then
    For Each C4R In C4
    If C4R <> "" Then
    For Each C5R In C5
    If C5R <> "" Then

    With ws2
    NRiga = .Cells(Rows.Count, Colonna).End(xlUp).Row
    .Cells(NRiga + 1, Colonna) = C1R
    .Cells(NRiga + 1, Colonna + 1) = C2R
    .Cells(NRiga + 1, Colonna + 2) = C3R
    .Cells(NRiga + 1, Colonna + 3) = C4R
    .Cells(NRiga + 1, Colonna + 4) = C5R
    End With

    If NRiga >= 500000 Then Colonna = Colonna + 6
    End If
    Next
    End If
    Next
    End If
    Next
    End If
    Next
    End If
    Next

    'Application.EnableEvents = True
    'Worksheets(1).Select

    Set ws1 = Nothing
    Set ws2 = Nothing
    Set C1 = Nothing
    Set C2 = Nothing
    Set C3 = Nothing
    Set C4 = Nothing
    Set C5 = Nothing
    End Sub

  7. #7
    Utente di HTML.it L'avatar di nelsonblu
    Registrato dal
    Feb 2007
    Messaggi
    2,234
    In realtà avevo appena completato il mio in access
    Gentilmente per pure confronto puoi verificare se dà gli stessi risultati per essere sicuro che funzioni correttamente?
    Con access risolve il tutto 17 righe piene in meno di 40 secondi per 1.400.000 record??..
    è in access 2007 a 32 bit e 64bit
    access a 64bit

    access 32bit

  8. #8
    Ciao!
    Perfetto!! E ti dirò di più... praticamente tutto questo "casino" con le combinazioni mi serviva per un programma magazzino che ho creato con Access! Rimanere in ambito access per me va anche meglio!

    Ti ringrazio infinitivamente! Spero di non averti rubato troppo tempo!

    Buon Weekend!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.