Excelfunderingar. Vet inte om du tycker detta är en herrans massa kod Jag har löst det så här. Jag är inte särskilt haj på VBA, men jag får det resultat jag var ute efter. Är det dumt skrivet? Om du tycker att koden gör det den ska är det väl Ok Jo, jag har tagit bort active.cell nu faktiskt. Att inte deklarera variabler är en ful ovana som jag vill inbilla mig får mindre och mindre betydelse när vi har så snabba datorer nu för tiden.Smartaste VBA-koden?
Jag har i kolumn A ett antal rader som alla börjar med fyra siffror (exepelvis "1234 Kokplattor") i kolumn B lika många rader som alla börjar med fem siffror (exempelvis "54321 Norrland"). I kolumn C har jag värden.
Jag läser in ett tal i en variabel (söknr) som alltid är något av de fyrsiffriga första i kolumn A (dvs 1234 i det här exemplet. Jag vill sedan loopa igenom alla rader och presentera följande resultat på ett annat kalkylblad i arket:
Summan av värdet (i C) för alla som uppfyller de fyra första i kolumn A (left,4) OCH alla som börjar på 5 i kolumn B. Denna summa ska skrivas ut i det andra bladet. Vidare vill jag att excel ska summera värdet (i C) för alla som uppfyller de fyra första i kolumn A (left,4) OCH alla som börjar på 54 i kolumn B. Och sedan summera värdet (i C) för alla som uppfyller de fyra första i kolumn A (left,4) OCH alla som börjar på 543 i kolumn B.
Alltså vill jag summera alla som börjar på 5 i en variabel som ska skrivas ut i det andra bladet, alla som börjar på de två första (54 här), alla som börjar på 543, alla som börjar på 5432 och också de som börjar på 54321. Och bara de rader som uppfyller kriteriet att de fyra första i A är = min inlästa variabel.
Är jag begriplig?
Resultatet ska alltså på det andra bladet bli:
5 = summan av C för alla som har 5 som första siffra i B i första bladet
54 = summan av C för alla som har 54 som första siffra i B första bladet.
543 = osv
5432 = ...
54321 = ...
Vilka dessa (5,54,543,5432,54321) är finns definerat i en lista. Hur löser man det på enklast sätt. Jag inbillar mig att det finns något enklare sätt än att definiera alla dessa variabler (5,54,543,5432,54321 osv) manuellt, läsa in hela cellen från A och låta if A-cellen = söknr and B-cellen left(1) = 5 then värde = värde + C-cellen.
Det blir liksom en herrans massa kod att skriva. Finns det något fiffigare sätt?Sv: Smartaste VBA-koden?
Vet inte heller om jag fattat dig rätt, men här är ett förslag
Sub Summera()
Dim inx As Long, inx2 As Long
Dim WordToSearch As String
Dim Lastrow As Long
Dim Firstrow As Long
Dim tmpVal As Long
Dim Curr1 As String
Dim Curr2 As String
Dim CurrValue As Long
Dim AntalTecken As Long
Dim CurrVillkor As String
' Antar att listan börjar på rad två
Firstrow = 2
' Hämtar sista rad i listan
Lastrow = Sheets("Blad1").Range("A65000").End(xlUp).Row
' Hämtar vad som skall eftersökas i kolumn A på Blad1
WordToSearch = Sheets("Blad2").Range("WordToSearch").Value
' En loop för varje villkor i en definierad lista på Blad2
For inx = 1 To Sheets("Blad2").Range("ListaVillkor").Cells.Count
tmpVal = 0
AntalTecken = Len(Sheets("Blad2").Range("ListaVillkor").Cells(inx).Value)
CurrVillkor = Sheets("Blad2").Range("ListaVillkor").Cells(inx).Value
' innre loop söker igenom alla rader och summera alla som uppfyller villkoret
For inx2 = Firstrow To Lastrow
Curr1 = Sheets("Blad1").Cells(inx2, 1).Value
Curr2 = Sheets("Blad1").Cells(inx2, 2).Value
CurrValue = Sheets("Blad1").Cells(inx2, 3).Value
If WordToSearch = Left(Curr1, 4) Then
If Left(Curr2, AntalTecken) = CurrVillkor Then
tmpVal = tmpVal + CurrValue
End If
End If
Next
'Skriver ut resultatet efter varje loop
Sheets("Blad2").Cells(9 + inx, 1).Value = "Villkor_" & inx & " " & CurrVillkor
Sheets("Blad2").Cells(9 + inx, 2).Value = tmpVal
Next
End Sub
Sv:Smartaste VBA-koden?
Sub kostn()
Dim konto As Variant
Dim kst As String
Dim kst2 As String
Application.ScreenUpdating = False
Sheets("Blad2").Select
kst = ActiveCell.Value
stopp = 1
x = 2
y = 2
'Hur många siffror är det i sökvärdet
Do Until stopp = ""
stopp = Cells(x, 1)
konto = Left(Cells(x, 1), 2)
kontroll = IsNumeric(konto)
If kontroll = True Then
antal = 1
End If
konto = Left(Cells(x, 1), 3)
kontroll = IsNumeric(konto)
If kontroll = True Then
antal = 2
End If
konto = Left(Cells(x, 1), 4)
kontroll = IsNumeric(konto)
If kontroll = True Then
antal = 3
End If
konto = Left(Cells(x, 1), 5)
kontroll = IsNumeric(konto)
If kontroll = True Then
antal = 4
End If
konto = Left(Cells(x, 1), 6)
kontroll = IsNumeric(konto)
If kontroll = True Then
antal = 5
End If
'Summera om
Sheets("Blad1").Select
stopp2 = 1
Do Until stopp2 = ""
stopp2 = Cells(y, 1)
kst2 = Left(Cells(y, 1), 4)
If kst2 = kst And Left(Cells(y, 2), antal) = Left(konto, antal) Then utfall = utfall + Cells(y, 3)
y = y + 1
Loop
Sheets("Blad2").Select
Cells(x, 2) = utfall
utfall = 0
y = 2
x = x + 1
Loop
Application.ScreenUpdating = True
End Sub
Sv: Smartaste VBA-koden?
Annars bör alla variabler vara deklarerade
Om man anger Option Explicit överst i modulen
blir du påmind att göra just detta.
Bara dumt att använda .select och active.cell
Referera direkt i koden till det blad eller cell det gällerSv: Smartaste VBA-koden?
Även detta att inte referera direkt till cellen... ja vad ska jag säga. Rättar till det direkt.