- Este tópico contém 20 respostas, 2 utilizadores e foi actualizado pela última vez há 11 anos, 4 meses por jorgerod.
-
AutorArtigos
-
-
22 de Agosto de 2013 às 23:16 #1351AlbinoParticipante
boas.
tenho a seguinte duvida:
haverá forma (ceretamnte que sim) de proteger uma linha para edição após ter alterado determinada celula?
isto é por ex: após escrever numa celula “pago” a linha correspondente a essa celula ficar automaticamente protegida para alteração.
já tenho um código para inserir data em determinada celula quando uma outra é alterada que é o seguinteprivate sub worksheet_change(byval target as excel.range)
activesheet.unprotect
if target.column = 8 and range(“$h$” & target.row) = “pago” then range(“$i$” & target.row).value = dateactivesheet.protect
end sub
o meu objectivo é: quando escrever “pago” na celula da coluna “h”, aparecer a data na celula da mesma linha da coluna “i” e depois essa linha ficar bloqueada.
espero ter sido explicito.
obrigado
albino -
22 de Agosto de 2013 às 23:34 #2231jorgerodAdministrador
boas, albino,
tenta adaptar o seguinte código:
private sub worksheet_change(byval target as excel.range)
activesheet.unprotect password:=”xpto”
if ucase(cells(target.row, 16)) = “x” then
cells(target.row, 1).resize(, 16).locked = true ‘bloqueia as cols a-o da linha activa
else
cells(target.row, 1).resize(, 16).locked = false
end ifactivesheet.protect password:=”xpto”, drawingobjects:=true, contents:=true, scenarios:=true
end subfica bem e diz qq coisa.
-
23 de Agosto de 2013 às 1:08 #2232AlbinoParticipante
boas
jorgerod
epá, apliquei o codigo no entanto devolve-me o erro 1004 e a linha
“cells(target.row, 1).resize(, 16).locked = false”, fica amarela.
o codigo que tenho:
____________________________________________
private sub worksheet_change(byval target as excel.range)activesheet.unprotect
if target.column = 8 and range(“$h$” & target.row) = “pago” then range(“$i$” & target.row).value = date
if ucase(cells(target.row, 16)) = “pago” then
cells(target.row, 1).resize(, 16).locked = true ‘bloqueia as cols a-o da linha activa
else
cells(target.row, 1).resize(, 16).locked = falseend if
‘activesheet.protect password:=”xpto”,
activesheet.protect , drawingobjects:=true, contents:=true, scenarios:=true
end sub
não sei o que está mal.abraço
-
23 de Agosto de 2013 às 1:38 #2233jorgerodAdministrador
albino,
manda-me a folha de exemplo, ok?
-
23 de Agosto de 2013 às 2:15 #2234AlbinoParticipante
boas
ai vai então.
de referir que os dados na folha são colados nessa folha vindo de outra atravez de macro.
na coluna “h” são sempre colados “deve”, ao alterar para “pago” será colada a data na coluna “i” e desejava que quando essa linha fosse alterada de “deve” para “pago” a mesma não pudesse ser alterada novamente (toda a linha).
CartaUtentes.xlsm -
23 de Agosto de 2013 às 2:30 #2235jorgerodAdministrador
albino,
por qualquer razão, não me deixa “sacar” o ficheiro. podes coloca-lo zipado?
-
23 de Agosto de 2013 às 2:32 #2236AlbinoParticipante
jorgerod
estava aefectuar alterações.
tenta agora
CartaUtentes.xlsm -
24 de Agosto de 2013 às 21:35 #2237jorgerodAdministrador
albino,
experimenta:
option compare text
private sub worksheet_change(byval target as excel.range)
activesheet.unprotect password:=””
if target.column = 8 and range(“$h$” & target.row) = “pago” then
range(“$i$” & target.row).value = date
elseif range(“$i$” & target.row).value “” then
cells(target.row, 1).resize(, 9).locked = true ‘bloqueia as cols a-i da linha activa
else
cells(target.row, 1).resize(, 9).locked = falseend if
activesheet.protect password:=””, drawingobjects:=true, contents:=true, scenarios:=true
end sub
fica bem e diz qq coisa, ok?
-
29 de Agosto de 2013 às 3:19 #2238AlbinoParticipante
boas
jorgerod.
ficou maravilha. 👿
muito obrigado. b)
cumprimentos -
29 de Agosto de 2013 às 16:40 #2239AlbinoParticipante
boas.
jorgerod.
afinal tenho mais uma pequena alteração para aquela instrução.
pretendo que quando colo os dados na folha, as celulas dessa linha fiquem bloqueadas excepto as das colunas j,k,l. quando efectuar a alteração na coluna j para “pago” entÃo toda a linha deverá ficar protegida excepto a coluna l.
tentei adaptar o código, mas não faz o que pretendo.
altei para:
option compare textprivate sub worksheet_change(byval target as excel.range)
activesheet.unprotect password:=”roma13″
‘apartir daqui alterei, mas não surte o efeito desejado
if range(“k$” & target.row).value = “deve” thencells(target.row, 1).resize(, 9).locked = true and cells(target.row, 10).resize(, 12).locked = false _
‘bloqueia as cols a-i e liberta as cols j-l da linha activa, pensava eu‘else
‘coloquei esta parte do código em baixo pensando que funcionaria
elseif target.column = 10 and range(“$j$” & target.row) = “pago” thenrange(“$k$” & target.row).value = date
end ifactivesheet.protect password:=”roma13″, drawingobjects:=true, contents:=true, scenarios:=true
end sub
mais uma vez peço a tua ajuda.
obrigado
cumprimentos -
30 de Agosto de 2013 às 18:05 #2240jorgerodAdministrador
boas, albino,
verifica o código que te envio em anexo e altera para de acordo com o que pretendes, em termos de colunas.
atenção: antes de iniciares a execução do código, deves desproteger a folha e clicar no canto superior esquerdo da mesma, para “marcares” toda a folha. depois, clicas com o botão direito do rato e escolhes “formatar células”. vais a protecção e desmarcas a flag “protegida”. a partir daqui, acho que o código já funcionará como pretendes.
experimenta e depois diz qq coisa, ok?
cumprimentos.
CartaUtentes_A.xlsm -
1 de Setembro de 2013 às 18:37 #2241AlbinoParticipante
boas
jorgeroda tua sugestão, com as alterações das linhas que eu efectuei funciona, no entanto a celulas da linha recém colada só ficam protegidas após a edição de uma celula.
eu necessitava que ao serem coladas as celulas na nova linha, essa linha ficasse bloqueada para edição excepto as celulas das colunas k,l e m dessa linha.
aquela instrução do “deve”, pensei eu, que ao ser colado o texto na linha a intrução fosse logo executada, mas isso não acontece. É que o “deve” é colado , não inscrito na linha. haverá forma de alterar isso?
se quiseres coloco aqui o ficheiro integral.
obrigado
abraço.
albino -
1 de Setembro de 2013 às 21:53 #2242jorgerodAdministrador
albino,
por favor coloca, ok? talvez seja mais fácil compreender 🙂 e tentar resolver…;)
-
3 de Setembro de 2013 às 13:19 #2243AlbinoParticipante
boas
jorgerod.
lá vai então o ficheiro. b)
obrigado
CartaUtentes2.1.xlsm -
3 de Setembro de 2013 às 18:45 #2244jorgerodAdministrador
albino,
por favor verifica o seguinte código:
option compare text
private sub worksheet_change(byval target as excel.range)
dim i as long
activesheet.unprotect password:=””i = activecell.column
cells(104536, i).end(xlup).offset(1, 0).selectif range(“$l$” & target.row) = “deve” then
cells(target.row, 1).resize(, 11).locked = true
cells(target.row, 12).locked = false
cells(target.row, 13).locked = false
cells(target.row, 14).locked = false
‘cells(target.row, 11).locked = false
‘cells(target.row, 12).locked = false
end ifif target.column = 12 and range(“$l$” & target.row) = “pago” then
range(“$m$” & target.row).value = date
elseif range(“$m$” & target.row).value “” then
cells(target.row, 1).resize(, 13).locked = true ‘bloqueia as cols a-m da linha activa
else
end if
activesheet.protect password:=””, drawingobjects:=true, contents:=true, scenarios:=true
end sub
como te referi antes, da 1ª vez que utilizes a folha e antes de iniciares a execução do código, deves desproteger a folha e clicar no canto superior esquerdo da mesma, para “marcares” toda a folha. depois, clicas com o botão direito do rato e escolhes “formatar células”. vais a protecção e desmarcas a flag “protegida”. a partir daqui, acho que o código já funcionará como pretendes.
-
3 de Setembro de 2013 às 20:46 #2245jorgerodAdministrador
albino,
quanto à questão dos botões de comando, porque não utilizar um toolbar apropriado?
então, aqui vai:
código para colocares em “este livro” (thisworkbook):
option explicit
private sub workbook_activate()
call showtoolbar(true)
end subprivate sub workbook_beforeclose(cancel as boolean)
call deletetoolbar
end subprivate sub workbook_deactivate()
call showtoolbar(false)
end subprivate sub workbook_open()
call createtoolbar
end subcódigo para colocares num módulo:
option explicit
public const strtoolbar = “my toolbar”
sub createtoolbar()
dim cbr as commandbar
dim cbb as commandbarbuttonon error resume next
commandbars(strtoolbar).delete
on error goto errhandler
set cbr = commandbars.add(strtoolbar)
with cbr
.position = msobartop
.visible = true
end withset cbb = cbr.controls.add(msocontrolbutton)
with cbb
.caption = “procurar”
.onaction = “procurar_click”
.style = msobuttoncaption
.visible = true
end withset cbb = cbr.controls.add(msocontrolbutton)
with cbb
.caption = “desfazer”
.onaction = “desfazer_click”
.style = msobuttoncaption
.visible = true
end withset cbb = cbr.controls.add(msocontrolbutton)
with cbb
.caption = “red”
.onaction = “red”
.style = msobuttoncaption
.visible = true
end withexithandler:
set cbb = nothing
set cbr = nothing
exit suberrhandler:
msgbox err.description, vbexclamation
resume exithandler
end subsub deletetoolbar()
on error resume next
commandbars(strtoolbar).delete
end subsub showtoolbar(f as boolean)
on error resume next
commandbars(strtoolbar).visible = f
end subsub red()
‘
‘ red macro
‘ macro recorded 11/01/2007 by samsung
‘‘
msgbox “teste”
end subexperimenta. vais encontrar este novo toolbar no tabulador “suplementos”.
experimenta e diz qq coisa, ok?
-
3 de Setembro de 2013 às 22:58 #2246AlbinoParticipante
olá
jorgerod.
em relação a este primeiro problema ela presiste, pois quando os dados são colados na folha control, as celulas de a a k só ficam protegidas após a edição de uma qualquer celula dessa linha.
todo resto funciona bem.
penso eu de que e, como sou basico nisto, não será que a instrução de “worksheet_change” só vai ser executada quando há alteração na folha? porque essa mesma instrução é executada após por ex: fazer duplo clic numa celula.ps:tentei algo e deu resultado foi o seguinte:
desactivei a linha
‘cells(target.row, 1).resize(, 11).locked = true
protegi todas as colunas de a a k e desprotegi as col l a n
ao rodar o código funciona como eu queria.vou experimentar a parte dos botões. depois digo algo
obrigado
-
4 de Setembro de 2013 às 3:21 #2247AlbinoParticipante
boas
jorgerodem relação há segunda parte do problema, fiz como tu indicas-te e resultou. outra coisa não era de esperar. :laugh:
há um pequeno senão no friso onde foram criados os botões ficam com letra muito pequena e não se notam separações entre eles. É possivel alterar isso?
no entanto está bom assim.
obrigado
albino -
4 de Setembro de 2013 às 15:09 #2248jorgerodAdministrador
albino,
sem ter experimentado, tenta:
set cbb = cbr.controls.add(msocontrolbutton)
with cbb
.caption = “procurar”
.font.name = “times new roman”
.font.size = 14
.onaction = “procurar_click”
.style = msobuttoncaption
.visible = true
end withse der resultado, faz o mesmo para o desfazer.
diz depois qq coisa, ok?
um abraço
-
4 de Setembro de 2013 às 16:00 #2249jorgerodAdministrador
albino,
apenas por brincadeira, experimenta este código, que coloca o comando a flutuar, de acordo com as tuas movimentações de células, para a direita e para a esquerda:
private sub worksheet_selectionchange(byval target as range)
if target.column < 3 or target.row < 3 then exit sub
with activesheet.shapes("moldura 3")
.top = target.offset(-2).top
.left = target.offset(, -2).left
end with
end sub -
4 de Setembro de 2013 às 18:29 #1352AlbinoParticipante
boas
jorgerod
quanto à 1ª dica, devolve-me o erro “method or data member not found”.
em relação á 2ª: é engraçado sim senhor, mas seria bom era que as molduras nunca saissem da primeira lunha e que se movimentassem só nessa linha conforme a posição do cursor.
tentei duplicar o código para a outra moldura mas devolveu-me um erro de quanquer coisa de ambiguo,
pensei então adicionar a “moldura 2” tambem ao código mas não consegui acertar com a expressão.
o códigoprivate sub worksheet_selectionchange(byval target as range)
if target.column < 3 or target.row < 2 then exit sub
with activesheet.shapes("moldura 3") and ("moldura 2")
'.top = target.offset(-0).top 'bloquei esta linha desta forma só se deslocam na horizontal
.left = target.offset(, -1).left
end with
end subcomo faço para incluir as duas molduras?
albino
-
-
AutorArtigos
- Tem de iniciar sessão para responder a este tópico.