Just nu i M3-nätverket
Gå till innehåll

Application.Screenupdating i Excel VBA


Tommy H

Rekommendera Poster

Hej!

Det är tydligen lite problem med att få "Application.ScreenUpdating = False" att fungera i vissa fall.

Jag har Googlat omkring en del och många har samma problem som jag.

Det verkar som om koden inte läses in utan tolkas som "True".

Problemet verkar uppstå då ett makro kallar på ett annat.

Det finns som sagt mycket på nätet om detta och många olika förslag på lösning, men jag har inte fått något att fungera bra.

Har någon ett bra tips?

/Tommy

Länk till kommentar
Dela på andra webbplatser

Den funktionen brukar jag inte ha problem med men ska medge att jag inte kört så mycket VBA i senaste versionerna av Excel, inte VBA som krävt denna. I vilka fall vill den inte? Har du kodexempel?

 

Länk till kommentar
Dela på andra webbplatser

Hej Monshi!

Hmmm...jag vet inte om jag "vågar" skicka över koden då den är 20år gammal och det var innan du hade läxat upp mig med mina "GoTo" & Selection rader...

Jag har inte velat göra om koden då den trots allt fungerar.

Här kommer den iaf:

Sub Uppdatera_Skåpkalkyl_Schneider()
    Application.ScreenUpdating = False

    Dim wbDatabas As Workbook
    Set wbDatabas = Workbooks("DATABAS.xls")
   
If wbDatabas Is Nothing Then
    On Error Resume Next
    Workbooks.Open Filename:="R:\PRENAD\kalkyl\DATABAS.xls", _
    UpdateLinks:=0
    On Error GoTo 0
End If
    Workbooks("DATABAS.xls").Activate
    Sheets("DATABAS").Select
       
5   ActiveWindow.ActivateNext
If ActiveSheet.Name = ("KALKYL") Then
    GoTo 6
Else
    GoTo 5
End If
6   Sheets("KALKYL").Select
    ActiveSheet.Unprotect
    ActiveSheet.Protect DrawingObjects:=True, CONTENTS:=True, Scenarios _
    :=True
    Range("A4").Select                                      'startläge på källblad
7   Do                                                      'Startläge för loop
    On Error GoTo hanteraFel
20  Sheets("KALKYL").Select                                 'förbereder för ny variabel
    ActiveCell.Offset(1, 0).Select                          'hämtar startpos för att hämta rad i källblad
If ActiveCell = 0 Then                                      'rader som ej skall hämtas
    GoTo 7
Else                                                        'rader som skall hämtas
    Resume Next
End If
   
    Dim X As Integer                                        'variabel för källblad (=x)
    X = ActiveCell.Value                                    'variabel för källblad (=x)
    ActiveCell.Offset(0, 1).Select
25  Workbooks("DATABAS.xls").Activate
    Sheets("DATABAS").Select
    ActiveSheet.Unprotect
    Columns("M:M").Select                                   'skall söka rad på källblad
    On Error GoTo 30                                        'om sökt rad ej hittas
    Selection.Find(What:=X, After:=ActiveCell, LookIn:=xlValues, _
    LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:= _
    xlNext, MatchCase:=True).Activate
If ActiveCell = 0 Then                                      'om sökt rad ej hittas så
    Sheets("KALKYL").Select                                 'gå till målblad för att ta ny rad
    ActiveCell.Offset(0, -1).Select                         'återgår till variabler på målblad
    GoTo 7                                                  'börja ny loop
Else
    GoTo 40                                                 'gå vidare på källblad
End If
40  ActiveCell.Offset(0, -12).Select                        'går till "A"-kolumnen på källblad
    ActiveCell.Range("A1:C1,H1:K1").Select                        'markerar det som skall kopieras
    Selection.Copy                                          'kopierar
    Sheets("KALKYL").Select                                 'går till "Målblad"
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
    False, Transpose:=False
45  Workbooks("DATABAS.xls").Activate
    Sheets("DATABAS").Select
    Application.CutCopyMode = True
    ActiveCell.Offset(0, 0).Select                          'går till "A"-kolumnen på källblad
    ActiveCell.Range("A1:C1,H1:K1").Select
    Selection.Copy
47  ActiveWindow.ActivateNext
If ActiveSheet.Name = ("KALKYL") Then
    GoTo 48
Else
    GoTo 47
End If
48  Sheets("KALKYL").Select
    Selection.PasteSpecial Paste:=xlPasteComments, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    ActiveCell.Offset(0, -1).Select                         'återgår till variabler på målblad
    Loop
30  ActiveWindow.ActivateNext
If ActiveSheet.Name = ("KALKYL") Then
    GoTo 35
Else
    GoTo 30
End If
35  Sheets("KALKYL").Select                                 'om sökt rad ej hittas på källblad gå till målblad
    Resume Next                                             'markerar av felhanterare
    ActiveCell.Offset(0, -1).Select                         'återgår till variabler på målblad
    GoTo 7                                                  'börja ny loop
hanteraFel:                                                 'allmän felhanterare
If ActiveCell = 0 Then                                      'om varibeln på målbladet är 0
    Resume Next                                             'markerar av felhanterare
    GoTo 7                                                  'börja ny loop
ElseIf ActiveCell = 173 Then                                'sista raden på målbladet
    GoTo 100                                                'går till makroavslut
Else
    Resume Next                                             'markerar av felhanterare
    Sheets("KALKYL").Select                                 'om värdet inte är 0 eller sista raden är nådd
    ActiveCell.Offset(0, -1).Select                         'återgår till variabler på målblad
    GoTo 20                                                 'förbereder för ny variabel
End If
100 Range("C3").Select                                      'intar slutposition på målblad
    Workbooks("DATABAS.xls").Activate
    Sheets("DATABAS").Select
    Range("A3").Select                                      'intar slutposition på källblad
    ActiveWindow.SmallScroll up:=3                          'intar slutposition på källblad
    ActiveSheet.Protect DrawingObjects:=True, CONTENTS:=True, Scenarios _
    :=True
60  ActiveWindow.ActivateNext
If ActiveSheet.Name = ("KALKYL") Then
    GoTo 70
Else
    GoTo 60
End If
70  Sheets("KALKYL").Select                                 'intar slutposition på målblad
    Range("D77").Select                                     'Raderar pålägg
    Selection.ClearContents                                 'Raderar pålägg
    Range("A1").Select                                      'intar slutposition på målblad
    Application.GoTo ActiveCell, Scroll:=True
    Range("C2").Select                                      'intar slutposition på målblad
    ActiveSheet.Protect DrawingObjects:=True, CONTENTS:=True, Scenarios _
    :=True
    Application.ScreenUpdating = True                       'uppdaterar skärmen igen
    MsgBox "Skåpkalkyl är uppdaterat för Schneider"         'slutmeddelande
    End Sub
'

Inte snyggt, jag vet men den fungerar, förutom ScreenUpdatingen som har fungerat tidigare....
/Tommy

 

Länk till kommentar
Dela på andra webbplatser

Ove Söderlund

Förutom att koden ger betraktaren en smärre huvudvärk... ?

 

så tror jag att - utan att för den skull testat att stega igenom koden - den kommer aldrig förbi GOTO 35/30-satsen och istället återgår till GOTO 7.

30  ActiveWindow.ActivateNext
If ActiveSheet.Name = ("KALKYL") Then
    GoTo 35
Else
    GoTo 30
End If
35  Sheets("KALKYL").Select                                 'om sökt rad ej hittas på källblad gå till målblad
    Resume Next                                             'markerar av felhanterare
    ActiveCell.Offset(0, -1).Select                         'återgår till variabler på målblad
    GoTo 7                                                  'börja ny loop
hanteraFel:                                                 'allmän felhanterare

1. Min uppmaning är definitivt att köra en riktig renovering av koden och därigenom bygga bort dessa felkällor som det lätt blir mha GOT-satser.

 

2. Använd gärna kod-funktionen <>-ikonen i inläggseditorn. Det gör kodtexten mer lättläst för oss andra som tittar på ditt inlägg :)

 

 

Länk till kommentar
Dela på andra webbplatser

Jo, jag är medveten om att det inte är det vackraste som jag har knåpat ihop!

Du har säkert rätt i vad du säger, jag tycker bara att det är synd att lägga tid på något som trots allt fungerar förutom skönhetsfelet med ScreenUpdating....

Får nog göra något nytt!

Tack ändå!

Länk till kommentar
Dela på andra webbplatser

ja, ta och uppfinns hjulet en gång till. Gör om gör bättre.

Det kan mycket väl ha med dina skiften mellan blad, aktiva celler osv som ställer till det.

Excels VBA kan arbeta helt utan någon select, activate eller goto-sats!

 

Tänk kanske lite modulärt, en sub-funktion för att lösa ett problem.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...