gravar valores de f...
 
Notifications
Clear all

gravar valores de form's

8 Posts
2 Usuários
0 Reactions
1,858 Visualizações
(@edcronos2)
Posts: 346
Reputable Member
Topic starter
 

meu grande problema não é fazer, mas oq fazer
pois bem, estou com uma dificuldade de tomar uma decisão para lá de boba "talvez pelo de ser meio depressivo", fico dando voltas e o treco nunca sai do lugar.

Há um tempo, eu fiz uma macro para gravar os valores dos objetos de userform em células
para evitar problemas de espaço dentro da celula eu resumi os valores verdadeiro e falso
F£|Fixa (6)|t|F£|F£|V£|F£||F£|F£|F£|F£||F£|V£|md|7|F£|F£|F£||V£|F£|F£|F£|F£|F£||F£|V£|V£|V£||F£||F£
como pode ter mais de uma gravação do mesmo userform eu chamei de slot cada celula é um slot
tenho alguns userforms e objetivo de aumentar

pois bem,
estou na duvida se uso um conjunto de celulas fixas para todos os userform ou se uso um conjunto de celulas para cada form
pensado na expansibilidade qual seria a melhor alternativa ?
como é uma planilha de projetos e não de cadastros nem sempre o form é gravado e nem sempre mais de uma vez e as vezes um deles tem varias gravações diferentes

oq me aconselham ?

 
Postado : 24/03/2016 9:05 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Ed, faz assim, numa planilha só, use colunas diferentes para representar seus diferentes forms, e dentro de cada coluna, uma célula nova é um slot novo.

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

 
Postado : 24/03/2016 9:34 am
(@edcronos2)
Posts: 346
Reputable Member
Topic starter
 

ola fernando, eu penso em ter algo assim para valores padrões de pesquisas

mas os forms trabalham em aba ativa apesar de tbm poder atuar em outras abas , isso pq cada aba corresponde a um projeto ou estudo diferente ou até mesmo sendo clones de outras abas
então eu tenho que ter a gravação na aba ativa correspondente ao projeto
a macro que grava e le é bem simples e trabalha para todos os formularios , sendo que se eu usar uma matriz unica para todos os form vou ter que modificar para adicionar o nome do form dentro do slot para se varrer e separar por form

 
Postado : 24/03/2016 9:44 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa sorte Ed

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

 
Postado : 24/03/2016 10:06 am
(@edcronos2)
Posts: 346
Reputable Member
Topic starter
 

sei que é algo que apenas eu posso resolver
mas até que me ajuda a pensar melhor

uma range unica para todos os form, com um numero limitado de utilização, mas com reserva para uso de qualquer unico deles
e uso o endereço da range em uma variavel constant, assim se tiver que ampliar ou mudar é só trocar o endereço na varialvel

pensei em colocar conjuntos separados em uma aba unica, mas normalmente as abas de projetos são apagadas ou totalmente desconfigurada do projeto inicial
sem falar que estou estruturando meu gravador de ações de macros para poder desfazer qualquer ações que minhas macros firzerem

 
Postado : 24/03/2016 10:25 am
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Boa sorte Ed

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

 
Postado : 24/03/2016 10:54 am
(@edcronos2)
Posts: 346
Reputable Member
Topic starter
 

bem estou tentando organizar a macro enquanto tento decidir oq fazer

Sub Grava_e_Le_valor_objetos(slot As Long, ByRef Objeto_Formulario As Object, ByRef Matriz_nomes_objetos, ByVal Grava_1__Le_0 As Long, ByVal NomeComboList As String)
    Dim Dr As String, D As String, SlotST()
    Sep = "|"
    SlotST = Range("C49:P55").Value2

    With Objeto_Formulario
        With .Controls(NomeComboList)

            Do While .ListCount > 0: .RemoveItem (0): Loop
            For L = 1 To UBound(SlotST, 1)
                For c = 1 To UBound(SlotST, 2)
                    If Left(SlotST(L, c), InStr(1, SlotST(L, c), Sep)) = Objeto_Formulario.Name Then
                        .AddItem SlotST(L, c)
                    End If
                    If SlotST(L, c) = "" Then
                        .AddItem "#Livre"
                        Exit Sub
                    End If
                Next
            Next
            slotv = .Value
        End With

        If Grava_1__Le_0 = 0 Then    ' Recuera valores
            If slotv <> "" Or slotv <> "#Livre" Then
                Dr = slotv
                vlob = Split(Dr, Sep)
                For r = 1 To UBound(Matriz_nomes_objetos) + 1
                    Dr = vlob(r)
                    If Dr = "V£" Then Dr = "True"
                    If Dr = "F£" Then Dr = "False"
                    Objeto_Formulario.Controls(Matriz_nomes_objetos(r)).Value = Dr
                Next
            Else
                MsgBox "Sem informação em " & slot
            End If
        Else    ' Grava valores
            Dr = ""
            For r = 0 To UBound(Matriz_nomes_objetos)
                D = Objeto_Formulario.Controls(Matriz_nomes_objetos(r)).Value
                If D = "Verdadeiro" Then D = "V£"
                If D = "Falso" Then D = "F£"
                Dr = Dr & D
                If r < UBound(Matriz_nomes_objetos) Then Dr = Dr & Sep
            Next

            SlotST(L, c) = Dr
            Range("C49:P55").Value2 = SlotST

        End If

    End With
End Sub

tbm não sei se "|" é um bom carácter de separação

 
Postado : 24/03/2016 1:56 pm
(@edcronos2)
Posts: 346
Reputable Member
Topic starter
 

como eu tenho o problema de misturar um monte de ideias na cabeça e sempre ter mais ideias para as coisas, eu tinha dado um tempo pq acaba atrapalhando
hoje eu peguei novamente e fiz algo mais simples que me atenda

no caso salva os valores dos objetos listados em uma das células de uma range

deixei separado para ficar mais fácil o entendimento
tenho que fazer mais uns ajustes mas está funcionando

para gravar
essa macro tem que ficar em um modulo para trabalhar com qualquer formulario

Sub Grava_valor_objetos( _
        ByRef Objeto_Formulario As Object, _
        ByRef Matriz_nomes_objetos, _
        ByVal SLot_posicao As Long)

    Dim Dr As String, D As String, ForNm As String

    ragSLT = "C49:P55"'range dos slot 

    sep = "|"
    SlotST = Range(ragSLT).Value2
    Lt = UBound(SlotST, 1)
    cT = UBound(SlotST, 2)

    With Objeto_Formulario
        nmform = .Name
        nnl = SLot_possicao

        n = 1
        For L = 1 To Lt
            For c = 1 To cT
                Dr = SlotST(L, c)
                If Dr <> "" And nnl > 0 Then
                    vlob = Split(Dr, sep):
                    If vlob(0) = nmform Then n = n + 1
                Else
                    If Dr = "" Then n = 0
                End If

                If n = nnl Then
                    If Dr <> "" And n > 0 Then MsgBox "Slot  " & nnl & "  ocupado, Deseja substituir ? "
                    Dr = Matriz_nomes_objetos(0) & sep
                    For r = 1 To UBound(Matriz_nomes_objetos)
                        D = Objeto_Formulario.Controls(Matriz_nomes_objetos(r)).Value
                        If D = "Verdadeiro" Then D = "V£"
                        If D = "Falso" Then D = "F£"
                        Dr = Dr & D
                        If r < UBound(Matriz_nomes_objetos) Then Dr = Dr & sep
                    Next
                    SlotST(L, c) = Dr
                    Range(ragSLT).Value2 = SlotST
                    Exit Sub
                End If
            Next
        Next
    End With
End Sub

para usar
no formulário
preferi usar os nomes dos objetos para ter um padrão mesmo se for feito modificação do formulario, e normalmente só se grava valores de alguns

Sub RealocarGrava_Click()
'refo é a lista dos nomes dos objetos que terão seus valores gravados
    refo = Array(Me.Name, "Fixacopy", "Plan_list", "De_1", "OZig_C", "Oinvq_C", "Oinvert_L", _
            "Oquadante_L", "OQuatL", "Oinvq_L", "Oinvert_C", "OZig_L", "Oquadante_C", "OQuatC", "OdpL", "Odpc", _
            "Para_2", "Quant", "Dquadante_L", "Dinvq_L", _
            "Dquadante_C", "DQuatL", "Ddpc", "DdpL", "Dinvert_L", "DZig_L", "Dinvert_C", "DZig_C", _
            "DQuatC", "Dinvq_C", "Alinhar_Baixo", "Latrea", "SetTud", _
            "TxtbAçõesOrigem", "ExecAçõesOrigem", "TxtbAçõesDestino", "ExecAçõesDestino")

Call Grava_valor_objetos(Me, refo, 0)
End Sub

para se recuperar os valores
é praticamente o mesmo funcionamento,
a macro procura por uma posição que tenha o nome do formulário e que seja na contagem do slot procurado

Sub Le_valor_objetos( _
        ByRef Objeto_Formulario As Object, _
        ByRef Matriz_nomes_objetos, _
        ByVal SLot_possicao As Long)

    Dim Dr As String, D As String, SlotST(), ForNm As String
    ReDim SlotS(1 To 3, 1 To 5)
    sep = "|"
    SlotST = Range("C49:P55").Value2
    Lt = UBound(SlotST, 1)
    cT = UBound(SlotST, 2)
    nnl = SLot_possicao
    If nnl > 0 Then  ' recupera valores
        With Objeto_Formulario
            nmform = .Name
            n = 1
            For L = 1 To Lt
                For c = 1 To cT
                    Dr = SlotST(L, c)
                    If Dr <> "" Then
                        vlob = Split(Dr, sep)
                        If vlob(0) = nmform Then
                            If n = nnl Then
                                For r = 1 To UBound(Matriz_nomes_objetos)
                                    Dr = vlob(r)
                                    If Dr = "V£" Then Dr = "True"
                                    If Dr = "F£" Then Dr = "False"
                                    .Controls(Matriz_nomes_objetos(r)).Value = Dr
                                Next
                                Exit Sub
                            Else
                                n = n + 1
                            End If
                        End If
                    Else
                        MsgBox "Não existe dados gravados de " & nmform & " no Slot " & nnl
                        Exit Sub
                    End If
                Next
            Next
        End With
    End If
End Sub


Sub Realocarle_Click()
  refo = Array(Me.Name, "Fixacopy", "Plan_list", "De_1", "OZig_C", "Oinvq_C", "Oinvert_L", _
            "Oquadante_L", "OQuatL", "Oinvq_L", "Oinvert_C", "OZig_L", "Oquadante_C", "OQuatC", "OdpL", "Odpc", _
            "Para_2", "Quant", "Dquadante_L", "Dinvq_L", _
            "Dquadante_C", "DQuatL", "Ddpc", "DdpL", "Dinvert_L", "DZig_L", "Dinvert_C", "DZig_C", _
            "DQuatC", "Dinvq_C", "Alinhar_Baixo", "Latrea", "SetTud", _
            "TxtbAçõesOrigem", "ExecAçõesOrigem", "TxtbAçõesDestino", "ExecAçõesDestino")

Call Le_valor_objetos(Me, refo, Me.Grava_Le.Value)
End Sub

bem com isso posso gravar estados de fomulários diferentes em uma mesma range , substituir os valores e regravar por cima
pretendo colocar um slot auxiliar para caso se queira fazer comparações
uma utilidade da macro seria para procurar valores padrões em vez do nome do formulário,
assim um formulário extenso se pode ter valores pré gravados e seria só procurar oq se quer

 
Postado : 18/04/2016 11:09 am