Avatar billede beanbag Nybegynder
23. november 2006 - 23:43 Der er 18 kommentarer og
1 løsning

Automatiser model. Variabelt antal viste kolonner.

Hej,

Jeg er ved at etablere en model hvor der bla. skal foretages en række beregninger for et antal år.
Antallet af år er variabelt og brugeren indtaster dette i en celle i arket med forudsætninger.
Kan jeg anvende denne indtastning til at skjule/vise det antal kolonner der er relevante?

pft
Thomas
Avatar billede excelent Ekspert
24. november 2006 - 09:01 #1
indsæt koden i arkets kodemodul
kolonne C til AA skjules
indtast i celle A1 hvor mange af de skjulte kolonner der skal vises
blot et eks.

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
Range("C1:AA1").Select: Selection.Columns.Hidden = True
Range("C1:" & Chr([a1] + 66) & "1").Select
Selection.Columns.Hidden = False
Cells(1, 1).Select
End Sub
Avatar billede excelent Ekspert
24. november 2006 - 09:09 #2
ups i første omgang nøjes vi med kolonne C til Z
skal flere kolonner skjules, skal der andre boller på suppen :-)

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
If Cells(1, 1).Value > 23 Then Cells(1, 1) = 23
Range("C1:Z1").Select: Selection.Columns.Hidden = True
Range("C1:" & Chr([a1] + 66) & "1").Select
Selection.Columns.Hidden = False
Cells(1, 1).Select
End Sub
Avatar billede beanbag Nybegynder
24. november 2006 - 13:42 #3
Hej excelent, tak for dit svar..

>Private Sub Worksheet_Change(ByVal Target As Range)
det bliver nok lidt for meget hvis makroen skal køre hver gang jeg ændrer noget. Eller har det ingen betydning?
Måske kan jeg bruge en drop down boks? Er det et problem at antallet af kolonner indtastes på et andet ark? (jeg samler alle overordnede forudsætninger på et ark)

>If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
jeg ville jo også gerne lære lidt - jeg kan forstå at denne linie afbryder sub'en hvis A1 er tom, men intersect - hvad gør den? Hvorfor er det ikke bare if A1 = nothing?

If Cells(1, 1).Value > 23 Then Cells(1, 1) = 23
Det er ok, der kan maksimalt indtastes for 10 år. Så jeg låser cellen med lidt validering. Når du skriver cells(1,1) er det så i forhold til hele arket? Hvorfor bruger du cells(1,1) istedet for a1?

Range("C1:Z1").Select: Selection.Columns.Hidden = True
hvordan er syntaksen for at referere til et andet sheet?

Range("C1:" & Chr([a1] + 66) & "1").Select
Hvad sker der her? Er det en tabel med alfabetet der starter med A=64, B=65 etc.  som du kan kalde med chr?

Selection.Columns.Hidden = False
Cells(1, 1).Select
End Sub

Ellers er det super - tror du vi kan knække det sidste?

tak
Thomas
Avatar billede excelent Ekspert
24. november 2006 - 14:49 #4
koden kører kun når du ændrer i A1
(A1 skal naturligvis ændres til den celle hvor du har antal år)

jeg anvender altid Intersect, for så kan jeg bruge Target senere i koden
(men jo i nogen tilfælde kan man godt nøjes med A1= et eller andet)

jeg anvender tit cells(x,x) - idet denne metode er lettere når/hvis
den skal benyttes i en løkke

for at referere til andet ark, skal der blot tilføjes arknavn (shhets(x))
Avatar billede excelent Ekspert
24. november 2006 - 14:52 #5
ja det er en form for translator idet chr(65)=A
men der er også andre metoder til at selektere kolonner
Avatar billede excelent Ekspert
24. november 2006 - 14:53 #6
Koden skal være i det ark hvor du indtaster antal år

hvilket ark skal kolonner skjules/vises ?
Avatar billede beanbag Nybegynder
24. november 2006 - 15:05 #7
Hmnn, jeg har flere ark der skal have skjult kolonner baseret på indtastningen i forudsætningsarket. F.eks.

Ark: Assumptions - her indtastes antal år mv.
Ark: top - her skal skjules et antal kolonner baseret på ovenstående
Ark: sale - her skal skjules et antal kolonner baseret på ovenstående
Ark: cogs - her skal skjules et antal kolonner baseret på ovenstående
Ark: opex - her skal skjules et antal kolonner baseret på ovenstående

Kan jeg ikke have koden i hvert af de efterfølgende ark og så referere til cellen i assumptionsarket?
Avatar billede excelent Ekspert
24. november 2006 - 15:11 #8
indtaster du antal år i alle ark ?
Avatar billede beanbag Nybegynder
24. november 2006 - 15:12 #9
nej - det er den samme indtastning i assumptionsarket der gælder for alle de øvrige ark
Avatar billede excelent Ekspert
24. november 2006 - 15:19 #10
koden trikker når man indtaster/ændrer i en bestemt celle
så du skal tilbage til Ark: Assumptions for at vise/skjule ark
så koden skal ligge der, medmindre du vil taste antal år for hvert ark
hvad mener du med refererer til assumptionsarket ?

er det samme kolonner i alle ark som skal skjules/vises ?
Avatar billede beanbag Nybegynder
24. november 2006 - 15:21 #11
ja
Avatar billede excelent Ekspert
24. november 2006 - 15:24 #12
ok - hvilke kolonner er det rent faktisk du vil vise/skjule
i mit eks er det C til Z ?
Avatar billede excelent Ekspert
24. november 2006 - 15:52 #13
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub
'On Error Resume Next
Dim x, sh
x = Target.Value
For sh = 2 To 5
Sheets(sh).Activate
Sheets(sh).Range("C1:Z1").Select
Selection.Columns.Hidden = True
Sheets(sh).Range("C1").Select
Selection.Resize(1, x).Select
Selection.Columns.Hidden = False
Sheets(sh).Range("C1").Select
Next
Sheets("Assumptions").Activate
Cells(1, 1).Select
End Sub
Avatar billede beanbag Nybegynder
24. november 2006 - 16:56 #14
Det er kolonne C-L, dvs. 10 kolonner som er det max. antal år jeg vil tage med i modellen.

Hvis jeg forstå koden korrekt, så skal jeg bare rette i denne linie

For sh = 2 To 5

hvis jeg har mere end 4 sheets der skal tilpasses mht. kolonner, og så skal de allesammen ligge lige efter assumptions som skal ligge som det første sheet.

Det ser perfekt ud (jeg tester det lige senere) tak for hjælpen og smid et svar.

ps. jeg forstår stadig ikke helt det med intersect (hvad den egentlig gør), men det må jeg forsøge at læse mig til.
Avatar billede excelent Ekspert
24. november 2006 - 22:44 #15
Ja arkene skal ligge efter hinanden idet arket længest til venstre har nr.1
og så fremdeles, og ja løkken kan blot udvides.

Fra vba-hjælp:
Returns a Range object that represents the rectangular intersection of two or more ranges
Avatar billede beanbag Nybegynder
27. november 2006 - 09:24 #16
Et hurtigt bonus spørgsmål.
Jeg har sat de to markerede linier ind med screenupdating, men kodens afvikling er stadig synlig på min skærm. Hvad gør jeg forkert?

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("d4")) Is Nothing Then Exit Sub
'On Error Resume Next
Dim x, sh
x = Target.Value
>>ScreenUpdating = False
For sh = 2 To 8
Sheets(sh).Activate
Sheets(sh).Range("C1:l1").Select
Selection.Columns.Hidden = True
Sheets(sh).Range("C1").Select
Selection.Resize(1, x).Select
Selection.Columns.Hidden = False
Sheets(sh).Range("C1").Select
Next
Sheets("Assumptions").Activate
Cells(1, 1).Select
>>ScreenUpdating = True
End Sub
Avatar billede kabbak Professor
27. november 2006 - 10:18 #17
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("d4")) Is Nothing Then Exit Sub
'On Error Resume Next
Dim x, sh
x = Target.Value

Application.ScreenUpdating = False
For sh = 2 To 8
Sheets(sh).Range("C1:l1").Columns.Hidden = True
Sheets(sh).Range("C1").Resize(1, x).Columns.Hidden = False
Next
Sheets("Assumptions").Activate
Cells(1, 1).Select
Application.ScreenUpdating = True
End Sub
Avatar billede excelent Ekspert
27. november 2006 - 15:18 #18
ups sry. en forglemmelse
går ud fra kabbaks indlæg rettede op på min fejl :-)
Avatar billede beanbag Nybegynder
27. november 2006 - 21:16 #19
At kalde det en fejl er måske lige hårdt nok ;)
Men det hjalp med den lille tilføjelse som kabbak kom med - tak.

Iøvrigt en af Excels lidt feminine sider at være så pernitten med at få skrevet det HELT rigtigt..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester