- Este tópico contém 20 respostas, 2 utilizadores e foi actualizado pela última vez há 11 anos, 6 meses por
jorgerod.
-
AutorArtigos
-
-
22 de Agosto de 2013 às 23:16 #1351
Albino
Participanteboas.
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 #2231
jorgerod
Administradorboas, 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 #2232
Albino
Participanteboas
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 #2233
jorgerod
Administradoralbino,
manda-me a folha de exemplo, ok?
-
23 de Agosto de 2013 às 2:15 #2234
Albino
Participanteboas
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 #2235
jorgerod
Administradoralbino,
por qualquer razão, não me deixa “sacar” o ficheiro. podes coloca-lo zipado?
-
23 de Agosto de 2013 às 2:32 #2236
Albino
Participantejorgerod
estava aefectuar alterações.
tenta agora
CartaUtentes.xlsm -
24 de Agosto de 2013 às 21:35 #2237
jorgerod
Administradoralbino,
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 #2238
Albino
Participanteboas
jorgerod.
ficou maravilha. 👿
muito obrigado. b)
cumprimentos -
29 de Agosto de 2013 às 16:40 #2239
Albino
Participanteboas.
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 #2240
jorgerod
Administradorboas, 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 #2241
Albino
Participanteboas
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 #2242
jorgerod
Administradoralbino,
por favor coloca, ok? talvez seja mais fácil compreender 🙂 e tentar resolver…;)
-
3 de Setembro de 2013 às 13:19 #2243
Albino
Participanteboas
jorgerod.
lá vai então o ficheiro. b)
obrigado
CartaUtentes2.1.xlsm -
3 de Setembro de 2013 às 18:45 #2244
jorgerod
Administradoralbino,
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 #2245
jorgerod
Administradoralbino,
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 #2246
Albino
Participanteolá
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 #2247
Albino
Participanteboas
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 #2248
jorgerod
Administradoralbino,
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 #2249
jorgerod
Administradoralbino,
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 #1352
Albino
Participanteboas
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.