Código específico r...
 
Notifications
Clear all

Código específico rodar nas planilhas independente do nome?

11 Posts
1 Usuários
0 Reactions
1,551 Visualizações
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Preciso de uma alteração neste código que o grande Fernando Fernandes me ajudou,
É o seguinte , minha pasta "Original" tem 5 Plans , Plan1(RESUMO) ,Plan2(Faixa) , Plan3(Produtividade) , Plan4(ASD), Plan5(BDAlimentadores) e funciona assim :
1-somente uma plan fica visivel por vez,
2- a Plan inicial sempre è RESUMO ,
3-a Plan2 sempre fica oculta , e só serve como modelo para cópias que usuario faz da mesma, e DÁ NOVOS NOMES que sempre são iniciados por "Faixa_" ;e são Plan>5
4-então onde no código consta "CASE nome da Plan" só posso nomear as Plans 1, 3, 4 pois haverá novas plan com nomes ainda desconhecidos
5-a plan 5 nunca fica visivel, são só dados:

Código do Fernando Fernandes:

Private Sub Workbook_Open()
On Error GoTo Finalizar
'declaração de variáveis e objetos

Dim shtSelected As Worksheet
Dim sht         As Worksheet
Dim strColunas  As String
Dim blPulaPlan  As Boolean
    
'Desligando o Refresh de tela, para vc não ver o Excel piscando na hora de rodar o código
    Application.ScreenUpdating = False
    
    Set shtSelected = ActiveSheet
'estrutura de repetição, para varrer todas as planilhas
    For Each sht In ThisWorkbook.Worksheets
        
'resolvi q só vou acertar o zoom das planilhas que de fato estiverem visíveis
        If sht.Visible = xlSheetVisible Then
            
'seleciona a planilha da vez
            sht.Select
            
'Dependendo do nome da planilha, este código vai determinar um endereço diferente, pq cada caso é um caso
            Select Case sht.Name
            
'---------------------------------------------------------------------------
'troque o nome plan1 para um nome de planilha que exista
                Case "Plan1"
'troque o endereço da plan deste caso, aqui na strColunas abaixo
                    strColunas = "A1:J1"
'---------------------------------------------------------------------------

'estas duas linhas acima (6 com os comentários, rs) podem ser replicadas (como abaixo) quantas vezes você quiser
'lembre-se de trocar o nome da planilha e o endereço para o zoom, como eu fiz abaixo para exemplificar

                Case "Plan2"
                    strColunas = "A1:M1"
                
                Case "Plan3"
                    strColunas = "A1:F1"
                
                Case "Plan4"
                    strColunas = "A1:G1"
                
                Case "Plan5"
                    strColunas = "A1:J1"
                
'Case Else é tipo, caso a plan não esteja listada acima, eu defini uma variável blPulaPlan, para pular esta planilha
'Isso pq esse For/Next está varrendo todas as planilhas.
                Case Else
                    blPulaPlan = True
                    
            End Select
'aqui eu defini que,
            If Not blPulaPlan Then
'se não é pra pular a plan, então chame a rotina AjustarZooom (igual à rotina q você já viu)
                Call AjustarZoom(sht, strColunas)
            Else
'se era pra pular a plan, então blPulaPlan está verdadeiro, e preciso torná-lo falso para a próxima rodada. esse Not INVERTE o valor de uma variável booleana
                blPulaPlan = Not blPulaPlan
            End If
        End If
    Next sht
    shtSelected.Select
    Set shtSelected = Nothing

Finalizar:
    Application.ScreenUpdating = True

End Sub

Private Sub AjustarZoom(ByRef sht As Worksheet, ByVal strColunas As String)
'Declaração de objetos e variáveis
Dim rngSelection As Range
Dim lRow As Long
Dim lCol As Long

'Verificando se a seleção atual é de uma célula (poderia ser uma imagem ou um gráfico, não tratados nesse código)
'Se a seleção for uma célula, registrando que célula é essa no objeto rngSelection
    If TypeName(Selection) = "Range" Then Set rngSelection = Selection

    With ActiveWindow
'ScrollRow e ScrollCol são propriedades do objeto window, que indicam qual a primeira linha e coluna da janela ativa, sendo vistas pelo Excel, respectivamente.
'Guardei seus resultados atuais nestas variáveis, só para poder recuperá-los mais tarde
        lRow = .ScrollRow
        lCol = .ScrollColumn

'Alterei os ScrollRow e ScrollCol para 1, garantindo que a primeira célula visível à esquerda é a célula A1
        .ScrollRow = 1
        .ScrollColumn = 1

'Selecionar de A a J
        sht.Range("A1:J1").Select
'Esta é a "mágica" do código. que acerta o zoom para a área selecionada acima
        .Zoom = True


'Pronto, tudo feito, agora é hora de recuperar o posicionamento de tela para aonde estava antes
        .ScrollRow = lRow
        .ScrollColumn = lCol
    End With

    If Not rngSelection Is Nothing Then
'e pra finalizar, agora que a tela voltou aonde estava, mas com outro zoom, hora de selecionar de volta aquela célula q estava selecionada
        rngSelection.Select
'destruindo as referencias ao objeto, em memória.
        Set rngSelection = Nothing
    End If

'FIM
End Sub

Fernando como solicitado segue o arquivo anexo ,
obrigado antecipadamente a todos

 
Postado : 30/06/2012 10:51 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Oi Claudinei, desculpa a demora, sabe como é, final de semana né, rs?

Então, vc disse que tem 5 planilhas. Ok.
Vc pode me passar os endereços do zoom para cada uma delas?
Tipo,
RESUMO: A1:J1
Faixa: A1:Q1
Produtividade: A1:P1
ASD: A1:J1
BDAlimentadores: A1:Z1
Faixa_* : A1:Q1

Apesar do nome das plans "Faixa_" (que na verdade são cópias da plan "Faixa", por isso imagino que o endereço visível em tela deverá ser o mesmo... certo?) serem diferentes, consigo capturar isso em código com certa facilidade.

Só preciso saber os endereços, pra já fazer o código completo e direitinho, pra vc não ter que mudar nada. Tendeu?
E no caso do código abaixo, que eu escrevi, eu vou manter a idéia do pular planilha somente para planilhas que não atendam suas regras. Vou também sempre rodar em todas as plans visíveis, seguindo sua lógica, e os diferentes endereços para as planilhas fixas (se tiverem visíveis), e o mesmo endereço pras planilhas visíveis cujo nome começarem com "Faixa".

E daí, fica tudo certo!
AH, e obrigado por criar outro tópico :)

Abraço!

 
Postado : 01/07/2012 10:17 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

É final de semana ai na metropole muita coisa pra fazer , muitos lugares pra ir,agora eu fico aqui em casa, carpindo e roçando (moro numa chacara ,interior de MG) , enquanto descansa carrega pedra. rsrssrs
RESUMO: A13:i13
Faixa: A97:M1
Produtividade: A1:J27
ASD: A1:O1
BDAlimentadores: A1:CD1
Faixa_* : A97:M1 ',É sim ,é o mesmo endereço da planilha "mãe"

 
Postado : 01/07/2012 3:06 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Oi Claudinei,
Vi o seu arquivo, tá ficando monstruosa a coisa ali hein? Cuidado cara, dica de programador antigo: Se quer programar, não só faça acontecer com seus códigos (essa parte é fácil, rs) mas procure seguir padrões de programação.
Declarar variáveis, identar código, não abusar do método .Select e dos ActiveCell, ActiveSheet, ActiveWorkbook, etc...

Ok Vamos lá.
Incluí essas linhas no comecinho do seu Workbook_Open

    '--Esta é a chamada para meu código - FF--
    Call Planilhando.AjustarZoomsDasPlanilhas
    '-----------------------------------------

Adicionei um módulo novo chamado, Planilhando, ali coloquei o meu código que é o seguinte:

'força declaração de variáveis
Option Explicit

'impede que funções aqui escritas, apareçam dentro do Inserir Função do Excel
Option Private Module

'força que as coleções utilizadas comecem do índice 1, ao invés de 0
Option Base 1

Public Sub AjustarZoomsDasPlanilhas()
On Error GoTo Finalizar
'declaração de variáveis e objetos

Dim shtSelected As Worksheet
Dim sht         As Worksheet
Dim strColunas  As String
    
'Desligando o Refresh de tela, para vc não ver o Excel piscando na hora de rodar o código
    Application.ScreenUpdating = False
    
    Set shtSelected = ActiveSheet
'estrutura de repetição, para varrer todas as planilhas
    For Each sht In ThisWorkbook.Worksheets
        
'resolvi q só vou acertar o zoom das planilhas que de fato estiverem visíveis
        If sht.Visible = xlSheetVisible Then
            
'seleciona a planilha da vez
            sht.Select

'define quais as colunas da planilha da vez
            strColunas = fnDefinirColunas(sht)

'se a string de colunas voltar vazia da função acima, a planilha não terá seu zoom alterado
            If strColunas <> "" Then
                Call AjustarZoom(sht, strColunas)
            End If
        End If
    Next sht
    shtSelected.Select
    Set shtSelected = Nothing

Finalizar:
    Application.ScreenUpdating = True

End Sub

Public Sub AjustarZoom(ByRef sht As Worksheet, ByVal strColunas As String)
'Declaração de objetos e variáveis
Dim rngSelection As Range
Dim lRow As Long
Dim lCol As Long

'Verificando se a seleção atual é de uma célula (poderia ser uma imagem ou um gráfico, não tratados nesse código)
'Se a seleção for uma célula, registrando que célula é essa no objeto rngSelection
    If TypeName(Selection) = "Range" Then Set rngSelection = Selection

    With ActiveWindow
'ScrollRow e ScrollCol são propriedades do objeto window, que indicam qual a primeira linha e coluna da janela ativa, sendo vistas pelo Excel, respectivamente.
'Guardei seus resultados atuais nestas variáveis, só para poder recuperá-los mais tarde
        lRow = .ScrollRow
        lCol = .ScrollColumn

'Alterei os ScrollRow e ScrollCol para 1, garantindo que a primeira célula visível à esquerda é a célula A1
        .ScrollRow = 1
        .ScrollColumn = 1

'Selecionar de A a J
        sht.Range("A1:J1").Select
'Esta é a "mágica" do código. que acerta o zoom para a área selecionada acima
        .Zoom = True


'Pronto, tudo feito, agora é hora de recuperar o posicionamento de tela para aonde estava antes
        .ScrollRow = lRow
        .ScrollColumn = lCol
    End With

    If Not rngSelection Is Nothing Then
'e pra finalizar, agora que a tela voltou aonde estava, mas com outro zoom, hora de selecionar de volta aquela célula q estava selecionada
        rngSelection.Select
'destruindo as referencias ao objeto, em memória.
        Set rngSelection = Nothing
    End If

'FIM
End Sub

Public Function fnDefinirColunas(ByRef sht As Worksheet) As String
'Declaração de variáveis
Dim lIndex As Long, arrPlanilhas, arrColunas

'Atribuição de matrizes a duas variáveis definidas sem tipo
    arrPlanilhas = Array("RESUMO", "Faixa", "Produtividade", "ASD", "BDAlimentadores", "Faixa_")
    arrColunas = Array("A13:I13", "A97:M1", "A1:J27", "A1: O1", "A1: CD1", "A97:M1")

'Loop na matriz arrPlanilhas comparando cada um de seus conteúdos com o nome da planilha da vez
    For lIndex = 1 To 5
        
'de o nomes da planilha bater com um conteúdo da matriz arrPlanilhas então
        If sht.Name Like arrPlanilhas(lIndex) Then
        
'pegar o endereço de colunas da matriz arrColunas, que já foi definida com os intervalos na
'mesma ordem da matriz arrPlanilhas
            fnDefinirColunas = arrColunas(lIndex)
            Exit Function
        End If
    Next lIndex
    
'Planilhas não listadas acima, só terão seu zoom alterado se iniciarem-se com "Faixa_"
    If VBA.Left(sht.Name, 6) = arrPlanilhas(6) Then
        fnDefinirColunas = arrColunas(6)
    End If
    
End Function

Segue também o arquivo com o código implementado.
Qualquer dúvida, é só chamar.

E importante, aquele código Get_Computer_Name tá com pau. Eu nem perdi meu tempo tentando arrumar. Comentei-o, fiz o que eu tinha que fazer, depois o descomentei.

 
Postado : 01/07/2012 8:08 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

FERNANDO ,PERFEITO , exatamente isso .
Bom primeiro acho que programador nunca serei , sou chutador , fuçador, adaptador etc rsrsrsrs , é que o que faço muito é isolar um código e ver o que ele faz , e se consigo adaptar em alguma planilha , mas não sei o que cada parte faz, até tento mas as vezes ... este é o motivo que se ver o meu código vc consegue enxuga-lo e fazer de forma muito mais simples; tirando muitos códigos em duplicidade , fazendo loop etc.
Quando vejo postagens que vc faz vou lá e baixo o codigo ,por serem quase 100% comentados ,quem sabe assim deixo ao menos de ser o chutador.
Adoro trabalhar com excel , agora só falta aprender.

Muitissimo obrigado mesmo pela ajuda ; te devo um churrasco lá em casa quando vier a Minas (Senador José Bento , arraial a 30km de Pouso Alegre). E olha to falando sério

Mais uma vez obrigado.

 
Postado : 02/07/2012 6:01 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Ah só mais uma coisa , no código

 Public Sub AjustarZoom(ByRef sht As Worksheet, ByVal strColunas As String)
'Selecionar de A a J
        sht.Range("A1:J1").Select
'Esta é a "mágica" do código. que acerta o zoom para a área selecionada acima
        .Zoom = True

tem esse sht.Range("A1:J1").select ,Porque? esse código é usado em todas as Plans né ? como ele funciona mesmo o endereço das outras plans sendo outro ?é por ter declarado novamente um endereço em fnDefinirColunas?

 
Postado : 02/07/2012 6:07 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Claudinei, muito bem observado.
Não está certo não, ali devia estar escrito (sem as aspas) strColunas, e não "A1:J1"

troque e veja se continua funcionando
e mais uma coisa... o ideal seria vc isar sempre endereços de uma linha só, vi que vc usou A97:M1... nao nao, isso é referente SÓ as colunas.

 
Postado : 02/07/2012 6:19 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Fernando me desculpa, mas fiz novos testes ; vi que tinha esquecido de deletar este código da planilha que te enviei ,

Private Sub Worksheet_Activate()
Dim rngSelection    As Range
Dim lRow            As Long
Dim lCol            As Long
    
    If TypeName(Selection) = "Range" Then Set rngSelection = Selection
    With ActiveWindow
        lRow = .ScrollRow
        lCol = .ScrollColumn
        .ScrollRow = 1
        .ScrollColumn = 1
        ActiveSheet.Range("A97:m97").Select
        .Zoom = True
        .ScrollRow = lRow
        .ScrollColumn = lCol
    End With
    
    If Not rngSelection Is Nothing Then
        rngSelection.Select
        Set rngSelection = Nothing
    End If
    
End Sub

que consta em cada uma das planilhas .

DELETEI-O.

Agora testei novamente fiz as alteraçoes em A97:M1 para A97:M97 (errei msm)E O DA STRCOLUNAS
Porém o seu código só funciona para a planilha visivel ou ativa não sei, ou seja se a Plan Resumo tiver visivel no ato de abrir a planilha o código faz efeito nela, caso contrario não; e isto vale para todas as planilhas.
Ou seja ele não tá varrendo todas as planilhas no ato da abertura da pasta.

Quanto ao erro em getComputer name é o seguinte esse código pega o nome do usuário + maquina +data e cria uma senha para se a data do contrato tiver vencida conseguir abrir o frmCad , conforme pode se ver em BDAlimentadores CA a CD ; assim:
30/06/2012 03:52 CLAUDINEI PC-CLAUDINEI 41508
01/07/2012 01:26 CLAUDINEI PC-CLAUDINEI 41300
29/06/2012 17:13 C047371 MICP5300100583 64965
01/07/2012 22:31 1 1A
01/07/2012 23:04 1 1A
01/07/2012 23:04 1 1A
01/07/2012 23:04 1 1A
01/07/2012 23:04 1 1A
02/07/2012 12:37 C047371 MICP5300105796

se o usuario for C"+ numeros" ele pega os 5 ultimos numeros ,se <> pega o valor das 3 ultimas letras e cria a senha
se a maquina for letras+numeros pega os 4 ultimos numeros , se <> pega o valor das 4 ultimas letras e cria a senha
e no seu caso o usuário é "1" e a maquina "1A" ai ficou em branco a senha ;dando erro; vou tentar arrumar aqui

 
Postado : 02/07/2012 9:55 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Oi Claudinei,

É fato que o codigo roda todas as planilhas, mas só age nas visíveis.

Posso rodar nas escondidas, desde que eu as torne visíveis, depois as retorne a invisíveis de novo.
Alterarei o código do módulo Planilhando, pra fazer deste jeito.

Segue novo código com algumas alterações na rotina AjustarZoomsDasPlanilhas

'força declaração de variáveis
Option Explicit

'impede que funções aqui escritas, apareçam dentro do Inserir Função do Excel
Option Private Module

'força que as coleções utilizadas comecem do índice 1, ao invés de 0
Option Base 1

Public Sub AjustarZoomsDasPlanilhas()
On Error GoTo Finalizar
'declaração de variáveis e objetos

Dim shtSelected As Worksheet
Dim sht         As Worksheet
Dim strColunas  As String
Dim xlVisivel   As Excel.XlSheetVisibility
    
'Desligando o Refresh de tela, para vc não ver o Excel piscando na hora de rodar o código
    Application.ScreenUpdating = False
    
    Set shtSelected = ActiveSheet
'estrutura de repetição, para varrer todas as planilhas
    For Each sht In ThisWorkbook.Worksheets
        
'guardando visibilidade da planilha numa variável
        xlVisivel = sht.Visible

'tornando a planilha visível, caso não esteja
        If Not sht.Visible = xlSheetVisible Then sht.Visible = xlSheetVisible
        
'resolvi q só vou acertar o zoom das planilhas que de fato estiverem visíveis
        If sht.Visible = xlSheetVisible Then
            
'seleciona a planilha da vez
            sht.Select

'define quais as colunas da planilha da vez
            strColunas = fnDefinirColunas(sht)

'se a string de colunas voltar vazia da função acima, a planilha não terá seu zoom alterado
            If strColunas <> "" Then
                Call AjustarZoom(sht, strColunas)
            End If
        End If

'recuperando visibilidade da planilha, caso necessário
        If Not sht.Visible = xlVisivel Then sht.Visible = xlVisivel
    Next sht
    shtSelected.Select
    Set shtSelected = Nothing

Finalizar:
    Application.ScreenUpdating = True

End Sub

Public Sub AjustarZoom(ByRef sht As Worksheet, ByVal strColunas As String)
'Declaração de objetos e variáveis
Dim rngSelection As Range
Dim lRow As Long
Dim lCol As Long

'Verificando se a seleção atual é de uma célula (poderia ser uma imagem ou um gráfico, não tratados nesse código)
'Se a seleção for uma célula, registrando que célula é essa no objeto rngSelection
    If TypeName(Selection) = "Range" Then Set rngSelection = Selection

    With ActiveWindow
'ScrollRow e ScrollCol são propriedades do objeto window, que indicam qual a primeira linha e coluna da janela ativa, sendo vistas pelo Excel, respectivamente.
'Guardei seus resultados atuais nestas variáveis, só para poder recuperá-los mais tarde
        lRow = .ScrollRow
        lCol = .ScrollColumn

'Alterei os ScrollRow e ScrollCol para 1, garantindo que a primeira célula visível à esquerda é a célula A1
        .ScrollRow = 1
        .ScrollColumn = 1

'Selecionar de A a J
        sht.Range("A1:J1").Select
'Esta é a "mágica" do código. que acerta o zoom para a área selecionada acima
        .Zoom = True


'Pronto, tudo feito, agora é hora de recuperar o posicionamento de tela para aonde estava antes
        .ScrollRow = lRow
        .ScrollColumn = lCol
    End With

    If Not rngSelection Is Nothing Then
'e pra finalizar, agora que a tela voltou aonde estava, mas com outro zoom, hora de selecionar de volta aquela célula q estava selecionada
        rngSelection.Select
'destruindo as referencias ao objeto, em memória.
        Set rngSelection = Nothing
    End If

'FIM
End Sub

Public Function fnDefinirColunas(ByRef sht As Worksheet) As String
'Declaração de variáveis
Dim lIndex As Long, arrPlanilhas, arrColunas

'Atribuição de matrizes a duas variáveis definidas sem tipo
    arrPlanilhas = Array("RESUMO", "Faixa", "Produtividade", "ASD", "BDAlimentadores", "Faixa_")
    arrColunas = Array("A13:I13", "A97:M1", "A1:J27", "A1: O1", "A1: CD1", "A97:M1")

'Loop na matriz arrPlanilhas comparando cada um de seus conteúdos com o nome da planilha da vez
    For lIndex = 1 To 5
        
'de o nomes da planilha bater com um conteúdo da matriz arrPlanilhas então
        If sht.Name Like arrPlanilhas(lIndex) Then
        
'pegar o endereço de colunas da matriz arrColunas, que já foi definida com os intervalos na
'mesma ordem da matriz arrPlanilhas
            fnDefinirColunas = arrColunas(lIndex)
            Exit Function
        End If
    Next lIndex
    
'Planilhas não listadas acima, só terão seu zoom alterado se iniciarem-se com "Faixa_"
    If VBA.Left(sht.Name, 6) = arrPlanilhas(6) Then
        fnDefinirColunas = arrColunas(6)
    End If
    
End Function
 
Postado : 02/07/2012 11:37 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

fechou!!!!!!!!!!!!!!!!!!!!!! Matou a pau ,
Muito obrigado

 
Postado : 02/07/2012 1:59 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

:)

 
Postado : 02/07/2012 3:16 pm