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

Tommy H

Medlem
  • Antal inlägg

    277
  • Gick med

  • Senaste besök


Anseende-aktivitet

  1. Gilla
    Tommy H gav anseende till Ove Söderlund i Styra word utskrift via Excel vba   
    Problemet med Application.ActivePrinter är att metoden endast styr standardskrivare såsom Excel självt ser det, inte i Windows som du behöver ändra i ditt fall. Använd istället kod som bygger på följande exempel:
    Sub Test() CreateObject("WScript.Network").SetDefaultPrinter "Microsoft Print to PDF" End Sub Du får förstås ändra strängvariabeln till vad som gäller för dig, och efteråt ställa tillbaka standardskrivaren till önskat utgångsläge.
     
    Lite läsvärt om hur du kan lista upp skrivarna och lagra i matris alternativt låta användaren välja skrivare i en lista;
    Listing Printers In VBA / Chip Pearson
     
     
  2. Gilla
    Tommy H gav anseende till Ove Söderlund i Excel VBA vilkor i If-sats   
    Prova att använda LIKE-operator;
     
    If Application.WorksheetFunction.CountBlank(rng3upp) = 3 _ And .Offset(0, -8) <> "" And .Offset(0, 2) = "" And .Offset(1, 1) = "" _ And .Offset(0, 6) = "" And .Offset(2, 0) Like "IN*" Then  
     
  3. Gilla
    Tommy H gav anseende till MH_resurrected i Excel VBA koll om cellområde är tomt   
    Kan du kolla runt med excelformlerna?
     
    =ANTAL(A1:B10) (räknar siffror)
    =ANTALV(A1:B10) (räknar allt innehåll, även tomma formler)
    =ANTAL.OM(A1:B10;"*")  (verkar bara räkna formler med synligt innehåll)
     
    de beter sig olika.
     
    En helt annan variant är att använda Excels sökfunktion och leta efter wildcard * och sök i: värden (om du står i  excel och trycker på sök ->alternativ så kan du välja att söka i formler eller värden). Om excel inte får någon träff (dvs området är tomt) blir resultatet Nothing. Det kan du använda i en IF-sats
        Dim test As Variant     Set test = MyRn2.Find(What:="*", LookIn:=xlValues)     If test Is Nothing Then         MsgBox "MyRn2 är tomt"     End If  
  4. Gilla
    Tommy H gav anseende till Ove Söderlund i Excel VBA koll om cellområde är tomt   
    Har du kunnat konstatera exakt vad som är i de celler som innehåller något "osynligt"? Är det mellanslagstecken, formler eller något annat?
     Den här sidan kan ge dig lite mer tips - jag funderar på om inte du skulle ha nytta av .Formula-satsen som finns som första exempel:
    https://sitestory.dk/excel_vba/cell_testing.htm
     
    'The following control tests if a cell is empty 'by testing the length of what may be in the cell. 'Therefore we use the property "Formula" 'instead of "Value". If you used "Value", 'it would say the cell is empty, even if 'it contains spaces/blanks. If Len(rCell.Formula) = 0 Then MsgBox "Cell " & rCell.Address & " is empty." End If  
  5. Gilla
    Tommy H gav anseende till MH_resurrected i Excel VBA koll om cellområde är tomt   
    Du berättar att  de är en excelfunktion du vill  använda när du skriver WorksheetFunction.xxxxx  (egentligen Application.WorksheetFunction.xxx om du vill vara ordentlig). Så du petar bara in det i koden.
     
    För att kolla om området är tom kollar du bara om antalet celler med innehåll är >0 
    IF WorksheetFunction.CountA(MyRn2) >0 then
    '*****Gör det du skall
    end if
     
    https://docs.microsoft.com/en-us/office/vba/api/excel.worksheetfunction
    Det är ju väldigt smidigt eftersom du kan testa hur excelformeln funkar utan att köra VBA 
     
  6. Gilla
    Tommy H gav anseende till Monshi i Excel VBA "Det går inte att ladda DLL filen"   
    Kan vara att det saknas referens till viss DLL i VBA.  Är felmeddelande så kortfattat som det duger oss? Står inte vilken DLL som saknas, du kan inte se vilken rad koden stannar på?
     
    Öppna VBA-editor, menyn Verktyg -> Referenser.
    Kontrollera om det skiljer sig mellan datorerna vad som finns där.
  7. Gilla
    Tommy H gav anseende till Monshi i Excel VBA kontroll av sammanhängande cellvärden i annan kolumn   
    Anar att du kör IE11.. finns problem med den webbläsaren och Eforum.
    //eforum.idg.se/topic/351788-kopiera-och-klistra-i-eforum/
     
    Att fånga en region, om du vet startcell inget problem
    set myRn = Range("A1", range("a1").end(xlDown))
    exempelvis.
    I bästa fall går den än enklare
    Set myRn =  Range("a1").CurrentRegion
    men det fungerar enbart som det verkligen är en isolerad grupp celler.
     
    Några alternativ.
  8. Gilla
    Tommy H gav anseende till Monshi i Kopiera celler till annan arbetsbok automatiskt   
    With wbTarget.Worksheets("Blad1")
    refererar till blad1 i arbetsboken som wbTarget refererar till
     
    Set rnTarget = .Cells(.Range("A1").CurrentRegion.Rows.Count + 1, 1)
    Röda punkterna, tar referensen från With-satsen
    Currentregion, sammanhängande område från referensen innan, dvs cell A1.
    +1 på slutet, en rad till.
    ,1 på slutet kolumn 1.
     
    End With
    Avslutar referensen på första raden.
  9. Gilla
    Tommy H gav anseende till MH_resurrected i Excel VBA Söka bladflikar   
    ****ED
    Som vanligt så ser koden för djävlig ut om din webbläsare tillåter externa script. En någorlunda ny Firefox blockerar som default, annars får du gå in i sidans källkod och glutta...
    ***/ED
     
    På ett ungefär, Lite tillkrånglat men du borde kunna hitta det du behöver i koden
     
    Förutsättningar:
    1. namnet står i A1
    2. du vill skriva data till i A10
    3. Den andra filen finns under C:/temp/ 
     
    Normalt sett undviker man klipp och klistra. Det blir så vansinnigt segt om man loppar lite. Istället tilldelar man helt enkelt Cell1 värdet från cell2
     
     
    Sub makroHämtaOchStäng()
    Dim strKällBladsNamn As String
    Dim Målblad As Worksheet
    Dim Källblad As Worksheet

    Set Målblad = Workbooks("det_första_bladet.xlsx").Worksheets("Blad1")

    strKällBladsNamn = Målblad.Range("A1").Value

    Workbooks.Open Filename:="C:\tmp\det_andra_bladet.xlsx"

    Set Källblad = Workbooks("det_andra_bladet.xlsx").Worksheets(strKällBladsNamn)

    Målblad.Range("A10").Value = Källblad.Range("G6").Value

    Målblad.Activate

    'Workbooks("det_andra_bladet.xlsx").Close

    End Sub
  10. Gilla
    Tommy H gav anseende till MH_resurrected i Skapa Sammanhängande område via offset i Excel Vba   
    Sub test()
    Dim rng1 As Range
    Set rng1 = ActiveCell.Offset(0, -13).Resize(15, 1)
    If Application.WorksheetFunction.CountBlank(rng1) = 15 Then
    Worksheets("Prenad").Range("A183").Value = "Tomt"
    Else
    Worksheets("Prenad").Range("A183").Value = "ifyllt"
    End If
    End Sub
  11. Gilla
    Tommy H gav anseende till MH_resurrected i Räkna unika textsträngar i Excel VBA   
    Formel?
    =ANTAL.OM(L:L;AA1)
    Osv.
     
    Tänk bara på att varje formel i AB kommer att leta i ganska många rader i L. Något slags begränsning när du skapar formeln, typ:
    =ANTAL.OM($L$1:$L$1000;AA1)
    (om det finns 1000 värden i L)
    Alternativt att du "låser" värdet för varje AB-cell så fort det är uträknat i din VBA kod.
     
     
    Ett helt annat alternativ är att skippa filtret och köra en pivottabell.
    Skapa en rubrik för kolumn L, t.ex "Rubrik"
    Markera Kolumn L, INFOGA->pivottabell, Platts = på detta kalkylblad, AA1
    lägg "Rubrik" som radetikett och "antal av Rubrik" som värde.
     
    Processorsnålt och effektivt men inte helt dynamiskt om du ändrar värden i L (om du gör om L till en tabell så kan du i  alla fall uppdatera pivoten med ett högerklick, även om du lagt till rader).
    /M
  12. Gilla
    Tommy H gav anseende till Mikael63 i Makrona är "inaktiverade" i Excel 2007   
    Och kört alla uppdateringar av Office?
     
    Tillägg:
     
     
    En enkel åtgärd att kontrollera detta är ju att kopiera in en fil på disken och testa...
  13. Gilla
    Tommy H gav anseende till Monshi i Sammanfoga texter från i VBA   
    Me.Range("c1") = Me.Range("a1") & "___" & WorksheetFunction.Text(Me.Range("b1"+1), "000")
     
    ?
     
    Om du ska räkna upp värdet.
  14. Gilla
    Tommy H gav anseende till Monshi i Riktlinjer för bra VBA-kod   
    VBA är ett ganska fritt språk, man kan skriva kod nästan hur som helst men samtidigt är det då lätt att skapa ren spaghettikod som inte alls gör det man tänkt sig. Med några enkla riktlinjer kommer man dock långt.
    Deklarerar alltid alla variabler
    Ställ i VBA-editorns alternativ, menyn Verktyg -> Alternativ, att variabler alltid måste deklareras. Raden Option Explicit läggs då till i alla (nya) kodmoduler. Att deklarera allt eliminerar en vanligt felkälla, felstavade variabler, samt ger snabbare kod.
    Deklarera alltid variabler som en specifik typ, även det ger en snabbare kod och enklare felsökning. Variant-typen är praktisk i vissa fall men bör vanligen undvikas.
     
    Select, Activate
    Vid inspelning av makron skapas alltid rader i stil med

    Range("A3").Select Selection.Copy Range("C4").Select ActiveSheet.Paste
    denna kod ska alltid redigeras, det ovan är inte bra kod. Select och Activate-satser ska enbart användas om man vill uppmärksamma användaren på något. Annars slöar de bara ned och orsakar fel.
    Koden ovan kan kortare skrivas som, exempelvis

    Range("A3").Copy Range("C4")
    Men inte heller denna är riktigt bra, se nästa stycke
     
    Referera korrekt
    Vid arbeta mot celler på blad ska man alltid sträva efter att ha en explicit referens till cellen man vill arbeta med. Skriver man bara Range("A4") = 1 kan man inte vara säker på var detta ämne hamnar
    Om koden skriven på ett modulblad hamnar värdet på det för tillfället aktiva bladet, det vill säga samma som att skriva ActiveSheet.Range("A4") = 1
    Om koden skriver på ett arbetsblads kodblad refererar koden till arbetsbladet ifråga, det vill säga samma som att skriva Me.Range("A4") = 1
     
    Att referera korrekt
    Finns tre sätt att referera till blad.
    Me
    Det kodblad (objekt) som koden finns skriven på.
    Worksheets("Bladnamn")
    Bladnamn är det namn som visas i fliklisten i Excel, ett namn användaren kan ändra.
    Blad1
    Det namn ett blad har i VBA-projektet. Om känt bör det eller, när så passar, Me-referens användas.
     
    With-satsen
    Enklaste sättet att hålla referenserna i styr är att använda With-satsen, exempelvis

    With WorkSheets("Blad1") .Range("A4").Copy .Range("B2") End With
    Notera punkten, .Range, som inleder referenserna. Denna ger att koden ovan är exakt samma som detta

    Worksheets("Blad1").Range("A4").Copy Worksheets.Range("B2")
    men med With-satsen blir koden tydligare och enklare att hantera.
     
    Snabba upp exekveringen
    Det som tar mest tid vid exekveringen är när koden ändrar på ett (synligt) arbetsblad. Minimera skrivningarna är alltid bra samt, om möjligt, skriva till flera celler i grupp.
    Ett annat sätt att snabba upp är att stänga av grafiska uppdateringarna av Excel

    Application.ScreenUpdating = False
    innan man börjar skriva till bladet och

    Application.ScreenUpdating = True
    när det är klart.
     
    Namn
    Referera till celler på bladet via adresser är lite vanskligt. En liten ändring på utseendet på bladet, en cell flyttas, kan VBA-koden haverera. En enkel lösning är att namnge de celler som VBA-koden ska använda och använda det namnet i koden istället. Namn som definieras i Excel följer med cellen/området, precis som en formel, om området flyttas. Om området raderas returnerar namnet ett felvärde varvid det blir enkelt att hitta var i koden det blir fel.
    När man definierat ett namn är det bara att använda det, tar samma exempel som ovan men säg att vi döpt källan till rnSource och målet till rnTarget
     

    Range("rnSource").Copy Range("rnTarget")
  15. Gilla
    Tommy H gav anseende till Monshi i Körfel '1004' i Excel VBA   
    1: Vilket blad adresserar du i
    Range("O3:O5000")
     
    2: Select-satser är av nästan lika mycket ondo som GoTo, helt onödiga i normal kod
     
     
    3: goto... no comment
     
    Städat din kod, vette tusan om den gör det du önskar men tror det.
    Sub Bladhantering()     Dim rnTarget As Range         Dim AntalRader As Integer     Dim i As Integer     Dim counter2 As Integer 'bladnumreringen     With Sheets("RULES")         .Range("O3:O5000").ClearContents         Set rnTarget = .Range("O2")                   counter2 = .Range("E2")     'Sätter in första bladnumret i cell "O2"         counter2 = counter2 + 1         rnTarget = .Range("D2") & "___" & "0" & counter2 - 1     'Antal rader för X1 innan sidbrytning         AntalRader = 65              Do While True 'något mer villkor rekommenderas!             For i = 0 To i = AntalRader                 Set rnTarget = rnTarget.Offset(1, 0)                 If rnTarget.Offset(0, -13).Value = "-X3" Then                     Exit Sub                  End If             Next i                       Do While Not (rnTarget.Offset(0, -13).Value = "-X1" And rnTarget.Offset(-1, -13) = "")                 If rnTarget.Row = 1 Then Exit Sub 'annars felvärde                 Set rnTarget = rnTarget.Offset(-1, 0)             Loop                          If rnTarget.Offset(0, -13).Value = "-X1" And rnTarget.Offset(-1, -13) = "" Then 'torde alltid vara uppfyllt men..                 counter2 = counter2 + 1                 rnTarget = Sheets("RULES").Range("D2") & "___" & "0" & counter2 - 1             End If         Loop     End With End Sub
  16. Gilla
    Tommy H gav anseende till Monshi i Excel VBA Jämföra texter på olika blad   
    Du ersätter din if-sats med min så ska det fungera på samma vis.
     
    En annan modell att lösa det via är att dela upp det i tre rutiner.
     
    1: En moderrutin
    2: En rutin som returnerar alla celler med felaktigt värde i
    3: En rutin, din Userform, som tar dessa celler som inargument och stegar igenom.
     
    Nu ska din kod fungera, jag ser inte vad som gör att den går fel vid en titt på koden. 
     
    Kan du ladda upp ett ark med ett exempel jag kan provköra, ett där det blir fel?
    Notera att du måste zippa kodaktiverade filformat för att eforum ska acceptera filen.
  17. Gilla
    Tommy H gav anseende till Monshi i Excel VBA Jämföra texter på olika blad   
    Två noteringar
    1: Du tar upp ett UserForm vid varje träff?
    2: Goto är nono. Nej nej nej, man ska INTE använda Goto, det är en ful avart i språket som man kan och ska undvika!
     
    sådär, du ska vi se vad som blir fel då..
    Vi börjar med
    1: variabeldeklarering. Du deklarerar några variabler på fel ställe, djupt inne i koden. I teorin ska en variabel deklarerad inom en With-sats inte leva utanför denna.
    2: Om du tar bort ditt Userform ur koden, kommentera bort det, blir rätt celler markerade?
    3: Din Goto. Bort med den:
    If mystring <> "" Then   mycell.Value = mystring mycell.Interior.ColorIndex = xlNone End If
  18. Gilla
    Tommy H gav anseende till Monshi i Stoppa Loop via Userform   
    Det ska fungera. Det ger rakt av att om värdet sant så avslutas funktionen.
  19. Gilla
    Tommy H gav anseende till Monshi i Stoppa Loop via Userform   
    Ne, så skriver man inte :-)
    CommandButton1 är ju inte ett värde, den är ett objekt. Om det är en flervalsknapp, en du kan trycka ned,  kan du iofs läsa av värdet på den via några argument till på knappen.
     
    Sedan får du även hantera om användaren inte gör ett val, om användaren trycker på krysset och stänger formuläret kontra trycker på Ok-knapp för att stänga.
    Sub Knapp1_Klicka()     With UserForm1         .Show         On Error GoTo errHandle         Dim blVal As Boolean         blVal = .MyVal         On Error GoTo 0         MsgBox blVal              End With Exit Sub errHandle:     blVal = False     Resume Next End Sub Option Explicit Dim myValue As Boolean Public Property Get MyVal() As Boolean     MyVal = myValue End Property Private Sub CommandButton1_Click()     myValue = True     Me.Hide End Sub Private Sub CommandButton2_Click()     myValue = False     Me.Hide End Sub Felhanterar för att hantera om formuläret termineras, dvs stängs via kryssklick istället för knapp.
     
     
  20. Gilla
    Tommy H gav anseende till Monshi i Excel VBA Jämföra texter på olika blad   
    Varför VBA-krav? Detta går med största sannolikhet att lösa med formler.
    Några PASSA-satser räcker:
    =OMFEL(PASSA(L4;Blad2!A:A;0);PASSA(L4;Blad2!D:D;0))
    och lägg på en villkorsstyrd formatering baserat på värdet i cellen där formeln finns. Om felvärde, gör inget, annars färglägg.
     
    Med kod
    Väldigt generella ord. Inte en specifik cell/område man ska leta efter värden i? Hela L? Hela A och D kolumnen?
    Okej, detta fungerar
    Sub MyFunction()     Dim rnSource As Range     Set rnSource = Blad1.Range("L:l").SpecialCells(xlCellTypeConstants)     Dim myAr As Range     Dim myCell As Range     Dim rnTarget As Range     Dim c As Range     For Each myAr In rnSource.Areas         For Each myCell In myAr             Set c = Blad2.Range("A:A").Find(myCell)             If c Is Nothing Then                 Set c = Blad2.Range("D:D").Find(myCell)             End If             If Not c Is Nothing Then                 myCell.Interior.ColorIndex = 23             End If         Next myCell     Next myAr End Sub
  21. Gilla
    Tommy H gav anseende till Monshi i EXCEL VBA ändra ensamt tecken i en textsträng   
    ha, j tänkte jag använda men det blev inte så...
    Tänkte en sak när jag startade, en annan sak när jag var klar.
     
     
    Funktionen ovan kan du använda som en UDF, dvs som en vanlig funktion på bladet eller så kan du anropa den från en annan som stegar igenom:
    Sub MyStepper() Dim myCell as Range For Each myCell in Blad1.Range("A1:A100") myCell.Offset(0,1) = MyReplace(myCell) Next myCell End Sub Ett exempel. Du kan adressera området den ska stega igenom dynamiskt, via namn eller hårdkodat som ovan. Jag vet inte hur ditt blad ser ut.
  22. Gilla
    Tommy H gav anseende till Monshi i EXCEL VBA ändra ensamt tecken i en textsträng   
    Rakt på sak utan krusiduller. Går att optimera om behov finns.
    I detta format som en funktion du kan anropa med annan kod eller, om du lägger i en modul, använda som en UDF, som en vanlig formel på kalkylbladet.
    Function MyReplace(rnSource As Range)     Dim strSource As String     Dim strDest As String          strSource = rnSource ' Blad1.Range("A1")     Dim sLeft As Integer, sRight As Integer     Dim i As Integer, j As Integer     For i = 1 To Len(strSource)         sLeft = -1         sRight = -1         If Mid(strSource, i, 1) = "X" Then             On Error Resume Next             If i <> 1 Then                 sLeft = Mid(strSource, i - 1, 1) * 1                             Else                 sLeft = 0             End If             If i <> Len(strSource) Then                 sRight = Mid(strSource, i + 1, 1) * 1             Else                 sRight = 0             End If             On Error GoTo 0         End If         If sLeft >= 0 And sRight >= 0 Then            strDest = strDest + "x"         Else             strDest = strDest + Mid(strSource, i, 1)         End If                                     Next     'Blad1.Range("A2") = strDest     MyReplace = strDest End Function Enkel teckenjämförelse, hårdkodat att X ska bytas till x.
     
     
  23. Gilla
    Tommy H gav anseende till Monshi i EXCEL VBA ändra ensamt tecken i en textsträng   
    Jag misstänker att "enklaste" vägen är en regexp-funktion.
     
    Andra sättet är att leta efter alla X, titta på värdet innan och efter (se om tal) och ändra värdet om det ska det.
  24. Gilla
    Tommy H gav anseende till MH_resurrected i EXCEL VBA ändra ensamt tecken i en textsträng   
    Googla VBA Replace wildcard
     
    Krångligare än jag trodde, men kolla:
    http://msdn.microsoft.com/en-us/library/office/aa188755(v=office.10).aspx
     
    och kanske lite hjälp härifrån:
    http://msdn.microsoft.com/en-us/library/office/aa188509(v=office.10).aspx
  25. Gilla
    Tommy H gav anseende till Monshi i Filtrera ut unika rader med Excel VBA   
    Nu läser jag igen. Alla rader med värde större än noll inom ett givet område.
    Sub Urval()     Dim myRn As Range     Dim ar As Range     Dim myCell As Range     Dim rnTarget As Range     Set rnTarget = Blad2.Range("l1") 'måcell och blad     With Blad1.Range("G1:G9") 'ändra blad1 till rätt referens, din källa         For Each myCell In .Cells             If myCell <> 0 Then 'villkor för att rad ska kopieras                 If myRn Is Nothing Then                     Set myRn = myCell.Offset(, -5).Resize(, 7)  'skapar korrekt referens                 Else                     Set myRn = Union(myRn, myCell.Offset(, -5).Resize(, 7))                 End If             End If         Next myCell         myRn.Copy 'kopierar         rnTarget.PasteSpecial Paste:=xlPasteValues 'klistrar in allt i ett svep              End With     Application.CutCopyMode = False End Sub Se kommentarer i texten, fråga om det är något.
×
×
  • Skapa nytt...