Notifications
Clear all

Como gerar quantidades diversas de combinações?

12 Posts
4 Usuários
0 Reactions
3,462 Visualizações
(@anderdiniz)
Posts: 20
Eminent Member
Topic starter
 

Quero que o código a seguir funcione para qualquer quantidade de elementos. O usuário deve apenas informar quais são os elementos e as combinações devem ser geradas automaticamente para 2, 3, 4, 5, 6, 7 ou qualquer quantidade de elementos que o usuário informar. Em uma caixa de texto o usuário informa a quantidade de elementos, em outra caixa de texto ele informa quais são os elementos, separados por traço. Por exemplo:
Quantidade de elementos: 7
Elementos: AA-BE-FT-CG-UY-WQ-IG.
Também pode ser um código diferente para atender as mesmas necessidades.

Option Explicit

Sub letraspermutadas()
    Dim conta, a, b, c, d As Integer
    Dim MyTxt(1 To 4) As String
    Dim MinhaLista(1 To 24) As String
    MyTxt(1) = "MA"
    MyTxt(2) = "MD"
    MyTxt(3) = "FA"
    MyTxt(4) = "F5"
 conta = 1
        For a = 1 To 4
            For b = 1 To 4
                For c = 1 To 4
                    For d = 1 To 4
                        If IsInArray(MyTxt(a), Array(MyTxt(b), MyTxt(c), MyTxt(d))) Or _
                            IsInArray(MyTxt(b), Array(MyTxt(a), MyTxt(c), MyTxt(d))) Or _
                            IsInArray(MyTxt(c), Array(MyTxt(a), MyTxt(b), MyTxt(d))) Or _
                            IsInArray(MyTxt(d), Array(MyTxt(a), MyTxt(b), MyTxt(c))) Then GoTo ali
                            MinhaLista(conta) = "1" & MyTxt(a) & "2" & MyTxt(b) & "3" & MyTxt(c) & "4" & MyTxt(d)
                            conta = conta + 1
ali:
                            Next
                            Next
                            Next
                            Next
                        
                        ComboBox1.List = MinhaLista
End Sub

Private Sub UserForm_Initialize()
    Call letraspermutadas
    
End Sub


Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
    IsInArray = UBound(Filter(arr, stringToBeFound)) > -1
End Function
 
Postado : 02/12/2017 9:41 am
(@mprudencio)
Posts: 2749
Famed Member
 

Vc vai precisar escrever um codigo para cada uma das condições que vc precisa.

E depois usar um if ou select case que atenda a necessidade e chame cada um dos codigos.

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 02/12/2017 12:36 pm
(@anderdiniz)
Posts: 20
Eminent Member
Topic starter
 

Quero um código só para as mais diversas combinações. É o algoritmo geral das combinações, como se fosse o algoritmo geral da potenciação em que você apenas informa a base e o expoente e o algoritmo calcula o resultado.

 
Postado : 03/12/2017 10:14 pm
(@mprudencio)
Posts: 2749
Famed Member
 

Vc nao entendeu o que eu disse, vc vai escrever varios codigos e junta-los de acordo com as regras do usuario.

No final é um codigo apenas.

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 04/12/2017 8:16 pm
(@anderdiniz)
Posts: 20
Eminent Member
Topic starter
 

Quero a tradução do código a seguir para VBA

/**
 * Esta classe gera e imprime as diferentes permutações de n objetos
 *
 */

public class Permutacoes {

	//numero da permutacao atual
	private static int cont=0; 
	
	//armazena a permutacao corrente
	private static char[] p;    
	
	
	/**
	 * metodo principal: recebe o vetor cujos elementos serão permutados
	 * @param vet
	 */
	public static void permuta(char [] vet) {
		
		p = new char[vet.length];
		permuta(vet,0);
	}
			

	/**
	 * método recursivo que implementa as permutacoes
	 * @param vet
	 * @param n
	 */
	private static void permuta(char []vet, int n) {
		
		if (n==vet.length) {
			cont++;
			imprime();
							
		} else {
					
			for (int i=0; i < vet.length; i++) {
			
				boolean achou = false;
			
				for (int j = 0; j < n; j++) {
				
					if (p[j]==vet[i]) achou = true;
				}
			
				if (!achou) {
					
					p[n] = vet[i];
					permuta(vet,n+1);
				}
				
			} //--for
			
		} //--if/else
		
	} //--permuta
	
	
	/** imprime a permutacao corrente */
	private static void imprime() {
		
		System.out.println();
		System.out.print("(" + cont + ") : ");
		for (int i=0; i < p.length; i++) System.out.print(p[i] + " ");
		
	} //--imprime
	

	/** metodo principal para teste da classe */
	public static void main(String[] args) {
		
		char v[] = {'A','B','C', 'D'};
		Permutacoes.permuta(v);
	}
	
}
 
 
Postado : 07/12/2017 9:06 am
Wagner Morel
(@wagner-morel-vidal-nobre)
Posts: 0
Illustrious Member
 

anderdiniz,

Boa tarde!

Veja se esse link pode te ajudar.
http://tangiblesoftwaresolutions.com/Pr ... erter.html

Desenvolvo pequenas soluções em VBA Excel a valores que variam entre R$ 50,00 a R$ 200,00. Se te interessar, entre no meu instagran (vba_excel_desenvolvimento)

Atenciosamente
Wagner Morel

 
Postado : 07/12/2017 10:20 am
(@anderdiniz)
Posts: 20
Eminent Member
Topic starter
 

Gerou este código, mas não sei como consetar:

Imports System

''' <summary>
''' Esta classe gera e imprime as diferentes permutações de n objetos
''' 
''' </summary>

Public Class Permutacoes

	'numero da permutacao atual
	Private Shared cont As Integer=0

	'armazena a permutacao corrente
	Private Shared p() As Char


	''' <summary>
	''' metodo principal: recebe o vetor cujos elementos que serao permutados </summary>
	''' <param name="vet"> </param>
	Public Shared Sub permuta(ByVal vet() As Char)

		p = New Char(vet.Length - 1){}
		permuta(vet,0)
	End Sub


	''' <summary>
	''' método recursivo que implementa as permutacoes </summary>
	''' <param name="vet"> </param>
	''' <param name="n"> </param>
	Private Shared Sub permuta(ByVal vet() As Char, ByVal n As Integer)

		If n=vet.Length Then
			cont += 1
			imprime()

		Else

			Dim i As Integer=0
			Do While i < vet.Length

				Dim achou As Boolean = False

				For j As Integer = 0 To n - 1

					If p(j)=vet(i) Then
						achou = True
					End If
				Next j

				If Not achou Then

					p(n) = vet(i)
					permuta(vet,n+1)
				End If

				i += 1
			Loop '--for

		End If '--if/else

	End Sub '--permuta


	''' <summary>
	''' imprime a permutacao corrente </summary>
	Private Shared Sub imprime()

		Console.WriteLine()
		Console.Write("(" & cont & ") : ")
		For i As Integer = 0 To p.Length - 1
			Console.Write(p(i) & " ")
		Next i

	End Sub '--imprime


	''' <summary>
	''' metodo principal para teste da classe </summary>
	Public Shared Sub Main(ByVal args() As String)

		Dim v() As Char = {"A"c, "B"c, "C"c, "D"c}
		Permutacoes.permuta(v)
	End Sub

End Class
 
Postado : 07/12/2017 10:39 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

anderdiniz, para mantermos o Forum organizado, favor manter o foco sempre no Tópico já aberto evite abrir outros com o mesmo assunto, se ainda não obteve a resposta ou a mesma não foi condizente, aguarde por novas contribuições.

Grato
Mauro Coutinho
Moderador

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 07/12/2017 10:48 am
(@anderdiniz)
Posts: 20
Eminent Member
Topic starter
 

Estou tentando transformar o código a seguir em VBA:

/**
* Esta classe gera e imprime as diferentes permutações de n objetos
*
*/

public class Permutacoes {

   //numero da permutacao atual
   private static int cont=0; 
   
   //armazena a permutacao corrente
   private static char[] p;    
   
   
   /**
    * metodo principal: recebe o vetor cujos elementos serão permutados
    * @param vet
    */
   public static void permuta(char [] vet) {
      
      p = new char[vet.length];
      permuta(vet,0);
   }
         

   /**
    * método recursivo que implementa as permutacoes
    * @param vet
    * @param n
    */
   private static void permuta(char []vet, int n) {
      
      if (n==vet.length) {
         cont++;
         imprime();
                     
      } else {
               
         for (int i=0; i < vet.length; i++) {
         
            boolean achou = false;
         
            for (int j = 0; j < n; j++) {
            
               if (p[j]==vet[i]) achou = true;
            }
         
            if (!achou) {
               
               p[n] = vet[i];
               permuta(vet,n+1);
            }
            
         } //--for
         
      } //--if/else
      
   } //--permuta
   
   
   /** imprime a permutacao corrente */
   private static void imprime() {
      
      System.out.println();
      System.out.print("(" + cont + ") : ");
      for (int i=0; i < p.length; i++) System.out.print(p[i] + " ");
      
   } //--imprime
   

   /** metodo principal para teste da classe */
   public static void main(String[] args) {
      
      char v[] = {'A','B','C', 'D'};
      Permutacoes.permuta(v);
   }
   
}

A dúvida inicial é em relação a esta linha:

 if (n==vet.length) {

Como transformá-la para VBA?

 
Postado : 07/12/2017 10:29 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Ubound(SeuArray)

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 08/12/2017 5:26 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

anderdiniz, já foi alertado para não abrir novos tópicos com o mesmo assunto, não é questão de trocar o Titulo e criar, você já tem este aberto, então toda a duvida referente ao mesmo poste neste.
Alerto que se desrespeitar esta regra mais uma vez o tópico será removido, peço a gentileza de se atentar a isso, assim mantemos o Forum organizado e mais limpo.

Grtao

Mauro Coutinho
Moderador

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 08/12/2017 5:43 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Como já deve ter percebido, apesar de haver similaridades, não e simples "pegar" uma rotina em outra linguagem e reescreve-la na desejada.
De nada adianta ir abrindo tópicos e mais tópicos. Eu, particularmente, já havia decidido não mais responder suas demandas pela maneira que se posiciona; termos tipo "Eu Quero" são utilizados por pessoas que contratam algo e pagam bem, podendo assim exigir o cumprimento de suas expectativas. Aqui a AJUDA e voluntaria, então não seja mandatório/autoritário; assim dito isso; experimente:
No modelo anexo, na coluna "M" entre com os termos que deseja combinar (Letras, numeros etc...)
Em N2 indique a quantidade que deseja a combinação.
Em A2:L2 e abaixo tera as combinações, um valor em cada celula
Não testei todas as possibilidades, pois meu equipamento e antigo e não comporta grandes processamentos.

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 08/12/2017 5:46 am