23. november 2006 - 23:43Der 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?
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
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
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
>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?
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?
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 ?
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
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.
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
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
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..
Synes godt om
Ny brugerNybegynder
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.