PNG32 PNG32 PNG32 PNG32
PNG32
Forum Excel, VBA, VSTO, Exceltips, Excelhj�lp PNG32 drivs av Excelspecialisten    Logga in     English
PNG32
PNG32 PNG32
PNG32

Logga in

PNG32

Du är inte inloggad. Logga in eller registrera dig för att skriva inlägg eller svara på inlägg.

För frågor om forumet, kontakta oss på webmaster@excelforum.se

PNG32 PNG32
PNG32 PNG32
PNG32

Excelforum

PNG32

 
ForumForumDiskussionerDiskussionerVBAVBA Excel-kod för att matcha och markera motsvarande debiteringar och krediteringar Excel-kod för att matcha och markera motsvarande debiteringar och krediteringar
Föregående Föregående
 
Nästa Nästa
Nytt inlägg
 2023-06-19 23:35
 
Jag behöver hjälp med min kod då jag lyckas inte få färgerna i slutet. Uppskattar om någon kan lösa problemet.  
Koden itererar igenom varje rad i det angivna datoområdet.
För varje rad kontrollerar den om nyckelorden "betalningsmottagare" och "avsändare" finns i kolumn G (Beskrivning).
Om nyckelorden hittas hämtar koden avsändaren, betalningsmottagaren och det motsvarande beloppet (debiterat eller krediterat).
Därefter söker den efter en matchande rad inom datoområdet där betalningsmottagaren och avsändaren är utbytta.
Om en match hittas jämför koden det debiterade och krediterade beloppet.
Om beloppen matchar färgar den debit- eller kreditcellen i den aktuella raden grönt och den motsvarande cellen i den andra raden också grönt.
Om beloppen inte matchar färgar den debit- eller kreditcellen i den aktuella raden orange och den motsvarande cellen i den andra raden också orange.
Detta framhäver visuellt matchningar och skillnader mellan de debiterade och krediterade beloppen i Excel-filen.
 
Här är de kolumner som används i koden:
 
Kolumn G: Beskrivning (för att söka efter nyckelord)
Kolumn A: Avsändare
Kolumn D: Betalningsmottagare
Kolumn L: Debitbelopp
Kolumn M: Kreditbelopp
 
Här är koden
 
Sub BalansTredjepartsKonton()
    Dim rng As Range
    Dim cell As Range
    Dim mottagare As String
    Dim avsändare As String
    Dim belopp As Double
    Dim motsvarandeCell As Range
    
    ' Fråga användaren att välja området med data att kontrollera
    On Error Resume Next
    Set rng = Application.InputBox("Välj området med data att kontrollera:", Type:=8)
    On Error GoTo 0
    
    ' Kontrollera om användaren avbröt valet
    If rng Is Nothing Then
        MsgBox "Åtgärden avbruten."
        Exit Sub
    End If
    
    ' Iterera genom varje cell i det angivna området
    For Each cell In rng
        ' Hämta värdet i cellen i kolumn G (Beskrivning)
        Dim beskrivning As String
        beskrivning = cell.Offset(0, 6).Value
        
        ' Sök efter nyckelord i beskrivningen
        If InStr(1, beskrivning, "mottagare", vbTextCompare) > 0 And InStr(1, beskrivning, "avsändare", vbTextCompare) > 0 Then
            ' Hämta avsändare och mottagare
            avsändare = cell.Offset(0, -6).Value
            mottagare = cell.Offset(0, -9).Value
            
            ' Sök efter motsvarande belopp (debiterat eller krediterat)
            For Each motsvarandeCell In rng
                If motsvarandeCell.Value = mottagare And motsvarandeCell.Offset(0, -6).Value = avsändare Then
                    ' Kontrollera om beloppet finns i debetkolumnen (L)
                    If Not IsEmpty(motsvarandeCell.Offset(0, -2).Value) Then
                        belopp = motsvarandeCell.Offset(0, -2).Value ' Hittat debiterat belopp
                    Else
                        belopp = motsvarandeCell.Offset(0, -1).Value ' Hittat krediterat belopp
                    End If
                    Exit For
                End If
            Next motsvarandeCell
            
            ' Kontrollera om det debiterade beloppet matchar det krediterade beloppet
            If Abs(belopp - cell.Offset(0, 12).Value) < 0.01 Then
                ' Beloppet är balanserat, färga debetcellen i grönt
                motsvarandeCell.Offset(0, -2).Interior.Color = RGB(0, 255, 0) ' Grönt
                ' Färga kreditcellen i grönt
                cell.Offset(0, 12).Interior.Color = RGB(0, 255, 0) ' Grönt
            Else
                ' Det finns en skillnad, färga debetcellen i orange
                motsvarandeCell.Offset(0, -2).Interior.Color = RGB(255, 165, 0) ' Orange
                ' Färga kreditcellen i orange
                cell.Offset(0, 12).Interior.Color = RGB(255, 165, 0) ' Orange
            End If
        End If
    Next cell
End Sub

 

Nytt inlägg
 2023-06-20 05:46
 

Hej Malko,

Det kommer gå mycket snabbare att hjälpa dig om du delar med dig av två kompletta datarader med transaktioner - en där det ska bli grönt och en där det ska bli orange - så man slipper hålla på med "Reverse Engineering" och skapa en egen tabell utifrån alla dina Offset.

Nytt inlägg
 2023-06-20 07:38
 

 

Sender/Receiver DATE NOTE IMPORTANT Receiver/Sender NOT IMPORTANT NOTE IMPORTANT2 DESCRIPTION DEBIT CREDIT
nicolas     sarah     nicolas send to sarah 300,00  
John      William      John receive from WILLIAM   1000
Alice     Bob     Alice receive from Bob   200
sarah     Nicolas     sarah receive from nicolas   300
william     John     John  send to william  1 000,00  
Olivier     maxime     Olivier send to maxime 500,00  
Maxime     Olivier     Maxime recieve from olivier   400
Nytt inlägg
 2023-06-20 08:20
 
 Ändrad av Gondi  på 2023-06-20 08:20:49

Hej igen Malko,

Tyvärr stämmer underlaget du skickade inte överens med koden. För det första är tabellen på engelska men koden letar efter svenska ord. För det andra använder koden offset från -9 till +12 så det saknas kolumner/underlag. Exempelvis vilka värden ska transaktionen jämföras med och vilka celler ska färgas gröna resp. orangea?

Kan du skicka ett komplett exempel med samtliga kolumner och värden i rätt kolumner och på rätt språk så det går att debugga koden utan att helt skriva om den.

Nytt inlägg
 2023-06-20 19:28
 

 Hej! 

Det löste sig till slut. fick svar från ett annat forum mr.excel.com 

här är koden: 

Sub Malkoriche() Dim Dict2 As Object Dim dict As Object Set dict = CreateObject("Scripting.Dictionary") Set Dict2 = CreateObject("scripting.dictionary") dict.CompareMode = vbTextCompare Dict2.CompareMode = vbTextCompare  [h2:i50000].Interior.Color = xlNone  a = Range("a2:i" & Cells(Rows.Count, "A").End(xlUp).Row).Value  For i = 1 To UBound(a, 1)      If InStr(a(i, 7), "send") >= 1 Then         If Not dict.exists(a(i, 1)) Then             debit = a(i, 8) 'Debit             dict.Add a(i, 1), debit '         Else              dict(a(i, 1)) = dict(a(i, 1)) + a(i, 8)         End If      ElseIf InStr(a(i, 7), "receive") >= 1 Then         If Not Dict2.exists(a(i, 4)) Then           credit = a(i, 9) 'Credit         Dict2.Add a(i, 4), credit           Else             Dict2(a(i, 4)) = Dict2(a(i, 4)) + a(i, 9)         End If      End If Next i  For Each ss In Range("a2:a" & Cells(Rows.Count, "A").End(xlUp).Row)          'Debit Checker         If dict.exists(ss.Value) Then                 If dict(ss.Value) - Dict2(ss.Value) = 0 Then                     ss.Offset(0, 7).Interior.Color = RGB(255, 235, 235)                 Else                      ss.Offset(0, 7).Interior.Color = RGB(255, 192, 0) 'If false                 End If         'Credit Checker         ElseIf dict.exists(ss.Offset(0, 3).Value) Then                 If dict(ss.Offset(0, 3).Value) - Dict2(ss.Offset(0, 3).Value) = 0 Then                         ss.Offset(0, 8).Interior.Color = RGB(255, 235, 235)                 Else                      ss.Offset(0, 8).Interior.Color = RGB(255, 192, 0) 'If false                  End If         Else             ss.Offset(0, 8).Interior.Color = RGB(255, 192, 0) 'If false         End If         Next ss  End Sub

 

Nytt inlägg
 2023-06-21 04:36
 
 Ändrad av Gondi  på 2023-06-21 06:38:42

Hej igen Malko,

Det var ju bra att du fick hjälp på annat håll. Jag har dock provkört koden och har följande kommmentarer.

  1. Det finns inte en enda rad i den nya koden som stämmer överens med koden du delade med dig av. Så precis som jag skrev fick man skriva om allting.
  2. Den nya koden uppfyller inte dina krav - och gör t.o.m. fel. Exempelvis transaktion mellan John och William (Belopp 1000kr) markeras med orange fast den borde vara grönmarkerad.
  3. Koden använder sig av VBA-objektet Dictionary från det externa biblioteket "Microsoft Scripting Runtime". Precis som riktiga ordböcker tillåter inte ett Dictionary dubbletter, så koden är "oanvänbar" i ett "riktigt" transaktionssammanhang och fungerar enbart med din exempeldata som inte innehåller några dubbletter.

Om man ska kunna skriva en "riktig" applikation som kan hantera tusentals, eller miljontals transaktioner enligt dina önskemål räcker det inte att använda sig av fälten "sender" och "receiver" samt belopp.

Varje transaktion måste vara unik - även om det är samma person som skickar pengar och samma belopp.

"Nicolas" kan ju exempelvis skicka 1000kr till både Sarah och John samma dag eller skicka 1000kr till Sarah flera gånger.

Därför måste man skapa en unik nyckel för varje transaktion så man kan identifiera den och knyta ihop den med en specifik mottagare, tidpunkt, belopp, osv.

Jag skulle starkt avråda från att använda koden du fick från MrExcel i ett riktigt affärssammanhang. 

 

Föregående Föregående
 
Nästa Nästa
ForumForumDiskussionerDiskussionerVBAVBA Excel-kod för att matcha och markera motsvarande debiteringar och krediteringar Excel-kod för att matcha och markera motsvarande debiteringar och krediteringar

PNG32 PNG32
Excelforum drivs av Excelspecialisten som bedriver utbildning i Excel och VBA, tillhandahåller support och hjälp med Excel, utvecklar program i Excel. Är ni i behov av en konsult inom Excel, VBA eller VSTO, eller söker en excelkurs, kontakta oss.
Copyright 2013 ExcelSpecialisten XLS AB   Användarvillkor  Personliga uppgifter