VGnet.dk - VBA i øvrigtKoden anvendes helt på eget ansvar! Indhold:
SorteringsrutinerSub BobleSortInteger(liste() As Integer) ' (C) Copyright Lars Vangsgaard ' Denne rutine sorterer en vilkårlig liste Dim Forste As Integer, Sidste As Integer Dim i As Integer, j As Integer Dim Temp ' Styr på start- og slutindeks Forste = LBound(liste) Sidste = UBound(liste) ' Gennemløber listen en masse gange For i = Forste To Sidste - 1 For j = i + 1 To Sidste ' Hvis det største står først, så byt om If liste(i) > liste(j) Then Temp = liste(j) liste(j) = liste(i) liste(i) = Temp End If Next j Next i End Sub Sub BobleSortDouble(liste() As Double) ' (C) Copyright Lars Vangsgaard ' Denne rutine sorterer en vilkårlig liste Dim Forste As Integer, Sidste As Integer Dim i As Integer, j As Integer Dim Temp ' Styr på start- og slutindeks Forste = LBound(liste) Sidste = UBound(liste) ' Gennemløber listen en masse gange For i = Forste To Sidste - 1 For j = i + 1 To Sidste ' Hvis det største står først, så byt om If liste(i) > liste(j) Then Temp = liste(j) liste(j) = liste(i) liste(i) = Temp End If Next j Next i End Sub Sub BobleSortString(liste() As String) ' (C) Copyright Lars Vangsgaard ' Denne rutine sorterer en vilkårlig liste Dim Forste As Integer, Sidste As Integer Dim i As Integer, j As Integer Dim Temp ' Styr på start- og slutindeks Forste = LBound(liste) Sidste = UBound(liste) ' Gennemløber listen en masse gange For i = Forste To Sidste - 1 For j = i + 1 To Sidste ' Hvis det største står først, så byt om If liste(i) > liste(j) Then Temp = liste(j) liste(j) = liste(i) liste(i) = Temp End If Next j Next i End Sub For at der sorteres rigtigt skal følgende direktiv placeres øverst i modulet: Option Compare Text Sub QuickSort(lft As Integer, rgt As Integer, liste As Variant) ' (C) Copyright Lars Vangsgaard Dim i As Integer, j As Integer, x As String, w As String i = lft j = rgt x = liste((lft + rgt) \ 2) Do Do While liste(i) < x i = i + 1 Loop Do While liste(j) > x j = j - 1 Loop If i <= j Then w = liste(i) liste(i) = liste(j) liste(j) = w i = i + 1 j = j - 1 End If Loop Until i > j If lft < j Then Call QuickSort(lft, j, liste) End If If i < rgt Then Call QuickSort(i, rgt, liste) End If End Sub Sub TestQuickSort() ' (C) Copyright Lars Vangsgaard Dim EnListe, i ReDim EnListe(1 To 10) EnListe(1) = "Her er" EnListe(2) = "en hel masse" EnListe(3) = "tekst, som" EnListe(4) = "skal sorteres" EnListe(5) = "af en smart ny" EnListe(6) = "funktion, som" EnListe(7) = "jeg har skrevet" EnListe(8) = "af efter" EnListe(9) = "en bog." EnListe(10) = "og dermed basta." Call QuickSort(1, 10, EnListe) For i = 1 To 10 Cells(i, 1) = EnListe(i) Next 'i End Sub AnnuitetFunction Annuitet(Rente As Double, Loebetid As Integer) As Double ' (C) Copyright Lars Vangsgaard Annuitet = Rente / (1 - (1 + Rente) ^ (-Loebetid)) End Function Decimalt tal til/fra binært talFunction BinaerEnc(ByVal x As Integer) As String ' (C) Copyright Lars Vangsgaard ' Omdanner et heltal til binært tal som streng Dim h, k, l, i If x < 0 Then BinaerEnc = "" ElseIf x = 0 Then BinaerEnc = "0" Else k = "" h = x l = 1 + Fix(Log(x + 0.001) / Log(2)) For i = 1 To l If h >= 2 ^ (l - i) Then k = k & "1" h = h - 2 ^ (l - i) Else k = k & "0" End If Next i BinaerEnc = k End If End Function Function BinaerDec(ByVal S As String) As Integer ' (C) Copyright Lars Vangsgaard ' Omdanner et binært tal som streng til heltal Dim h, k, l, c, i l = Len(S) k = "" For i = 1 To l c = Mid(S, i, 1) If c = "0" Or c = "1" Then k = k + c End If Next i l = Len(k) If l = 0 Then BinaerDec = 0 Else h = 0 For i = 1 To l c = Mid(k, i, 1) If c = "1" Then h = h + 2 ^ (l - i) End If Next i BinaerDec = h End If End Function PIN-kode-huskeren "KKode"Function KKode(kode As Integer, basis As Integer, ind As Boolean) ' (C) Copyright Lars Vangsgaard Dim kstr As String, i As Integer, denne As Integer, res As String kstr = CStr(kode) If ind Then res = "" denne = basis For i = 1 To Len(kstr) denne = (denne + CInt(Mid(kstr, i, 1))) Mod 10 res = res + CStr(denne) Next i Else res = CStr((10 + CInt(Mid(kstr, 1, 1)) - basis) Mod 10) If Len(kstr) > 1 Then For i = 2 To Len(kstr) res = res + CStr((10 + CInt(Mid(kstr, i, 1)) - CInt(Mid(kstr, i - 1, 1))) Mod 10) Next i End If End If KKode = res End Function Find dubletter eller unikke værdierFunction Dubletter(rng As Range) As Boolean ' (C) Copyright Lars Vangsgaard Dim dic, cl Set dic = CreateObject("Scripting.Dictionary") On Error Resume Next For Each cl In rng If Not IsEmpty(cl) Then dic.Add UCase(CStr(cl.Value)), 0 If Err <> 0 Then Dubletter = True On Error GoTo 0 Exit Function End If End If Next On Error GoTo 0 Set dic = Nothing End Function Function DubletterMedd(rng As Range) As Boolean ' (C) Copyright Lars Vangsgaard Dim dic, cl, msg msg = "" Set dic = CreateObject("Scripting.Dictionary") On Error Resume Next For Each cl In rng If Not IsEmpty(cl) Then dic.Add UCase(CStr(cl.Value)), 0 If Err <> 0 Then Dubletter = True msg = msg & vbCrLf & cl.Value Err.Clear End If End If Next On Error GoTo 0 If Dubletter = True Then MsgBox "Dubletter:" & vbCrLf & vbCrLf & msg End If Set dic = Nothing End Function Function FindAlleKombinationer(KolonneBegynd As Integer, KolonneSlut As Integer, RækkeBegynd As Integer, Skillestreng As String) ' (C) Copyright Lars Vangsgaard ' Finder alle kombinationer af celleindhold indenfor et område i regnearket ' Returnerer et array af kombinationer inkl. skilletegn(/-strenge) ' Anvendelse: f.eks.... 'Sub TestFindAlleKombinationer() ' Dim i, a ' a = FindAlleKombinationer(1, 3, 5, "#") ' For i = LBound(a) To UBound(a) ' Debug.Print a(i) ' Next i 'End Sub Dim i As Integer, j As Integer, RækkeSlut As Integer, Kombination As String Dim dic As Object If KolonneBegynd > KolonneSlut Then Exit Sub RækkeSlut = Cells(RækkeBegynd, KolonneBegynd).CurrentRegion.Cells(Cells(RækkeBegynd, KolonneBegynd).CurrentRegion.Cells.Count).Row If RækkeBegynd > RækkeSlut Then Exit Sub Set dic = CreateObject("Scripting.Dictionary") For i = RækkeBegynd To RækkeSlut Kombination = Cells(i, KolonneBegynd) If KolonneSlut > KolonneBegynd Then For j = KolonneBegynd + 1 To KolonneSlut Kombination = Kombination & Skillestreng & Cells(i, j) Next j End If 'Debug.Print Kombination On Error Resume Next dic.Add Kombination, Kombination Next i FindAlleKombinationer = dic.Keys End Sub Function RangeDimension(rg As Range) As Variant ' (C) Copyright Lars Vangsgaard If rg.Areas.Count > 1 Then RangeDimension = Array(3) Else If rg.Rows.Count = 1 Or rg.Columns.Count = 1 Then RangeDimension = Array(1, rg.Rows.Count, rg.Columns.Count) Else RangeDimension = Array(2, rg.Rows.Count, rg.Columns.Count) End If End If End Function Function FindUnikke(rg As Range, Optional drc As Byte) As Variant ' (C) Copyright Lars Vangsgaard Dim rgdim As Variant Dim dic As Object Dim cl As Range Dim data() As Variant Dim key As String Dim i, j As Long If IsMissing(drc) Then drc = 1 If TypeName(rg) = "Range" Then rgdim = RangeDimension(rg) Else rgdim = Array(3) If drc < 1 Or drc > 2 Or rgdim(0) > 2 Then FindUnikke = Empty Exit Function End If Set dic = CreateObject("Scripting.Dictionary") If rgdim(0) = 1 Then On Error Resume Next For Each cl In rg dic.Add CStr(cl.Value), cl.Value Next cl On Error GoTo 0 FindUnikke = Array(dic.Items) ElseIf rgdim(0) = 2 Then If drc = 1 Then On Error Resume Next For i = 1 To rgdim(1) key = "" ReDim data(1 To rgdim(2)) For j = 1 To rgdim(2) key = key & "€" & CStr(rg.Cells(i, j)) data(j) = rg.Cells(i, j) Next j dic.Add key, data Next i On Error GoTo 0 FindUnikke = dic.Items ElseIf drc = 2 Then On Error Resume Next For i = 1 To rgdim(2) key = "" ReDim data(1 To rgdim(1)) For j = 1 To rgdim(1) key = "€" & CStr(rg.Cells(j, i)) data(j) = rg.Cells(j, i) Next j dic.Add key, data Next i On Error GoTo 0 FindUnikke = dic.Items Else FindUnikke = Empty End If Else FindUnikke = Empty End If Set dic = Nothing End Function Sub TestFindUnikke() ' (C) Copyright Lars Vangsgaard Dim h, wb h = FindUnikke(Selection, 1) Set wb = Workbooks.Add wb.Activate SkrivArray h, wb.Sheets(1).Cells(1, 1) Set wb = Nothing End Sub Statistisk multifunktionFunction StatFunc(rng, op) ' Multifunktion indenfor statistik. ' Af John Walkenbach, http://www.j-walk.com/ss/excel/tips/tip43.htm, let ændret. Select Case UCase(op) Case "SUM" StatFunc = Application.Sum(rng) Case "AVG" StatFunc = Application.Average(rng) Case "MED" StatFunc = Application.Median(rng) Case "MOD" StatFunc = Application.Mode(rng) Case "CNT" StatFunc = Application.Count(rng) Case "MAX" StatFunc = Application.Max(rng) Case "MIN" StatFunc = Application.Min(rng) Case "VAR" StatFunc = Application.Var(rng) Case "STD" StatFunc = Application.StDev(rng) Case Else StatFunc = Evaluate("NA()") End Select End Function Manipulér en talserieFunction ØgAmplitude(ByVal yværdi, ByVal ytyngde, ByVal parameter) ' (C) Copyright Lars Vangsgaard ' Øger en "funktions" amplitude med faktor parameter i forhold til tallet ytyngde. ØgAmplitude = ytyngde + parameter * (yværdi - ytyngde) End Function Function DrejFunktion(ByVal yværdi, ByVal xværdi, ByVal xtyngde, ByVal xafstand, ByVal parameter) ' (C) Copyright Lars Vangsgaard ' "Drejer" en "funktion" mod uret om xtyngde med parameter pct. for xværdi=xtyngde+xafstand. ' f(xtyngde + xafstand) -> (1+parameter/100) * f(xtyngde + xafstand) ' f(xtyngde - xafstand) -> (1+parameter/100) * f(xtyngde - xafstand) ' Faktoren parameter skaleres lineært mellem xtyngde - xafstand og xtyngde + xafstand. DrejFunktion = yværdi * (1 + parameter * 0.01 * (xværdi - xtyngde) / xafstand) End Function Siden er oprettet 25-12-2006 og sidst opdateret 14-01-2007 22:53. █ |