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

 
ForumForumDiskussionerDiskussionerVBAVBAArray loopArray loop
Föregående Föregående
 
Nästa Nästa
Nytt inlägg
 2016-06-28 07:56
 
 Ändrad av hassanikassan  på 2016-06-28 07:58:09

Hej! Började med VBA-kodning förra veckan så är verkligen nybörjare.

Jag undrar hur jag kan använda arrays i min kod för att få messagebox att visa alla ID-nummer som matchar mina kriterier nedan. ID-Numrena finns i min D-kolumn från D2 till D300 och jag vill få upp id-numrena i messagebox varje gång mina kriterier matchar en cell.

Jag vill alltså att min messagebox visar alla ID-nummer som är äldre än 10 år.

Här är mina koder. De är antagligen usla och svider i era ögon att titta på men som sagt så är jag en 1-veckas nybörjare på dehär! Skulle va sjukt tacksam för svar!

 

Sub DeliveryDateAlarm()

Dim k As Long

Dim i As Long

k = 10

For i = 2 To Cells(2, k)

If DateDiff("m", Cells(i, k), Date) > 120 And Cells(i, k) <> 0 Then

Cells(i, 1).EntireRow.Interior.ColorIndex = 3 Else

Cells(i, 1).EntireRow.Interior.ColorIndex = 0

End If

Next i

Dim l As Long

Dim n As Long

Dim found As Boolean

l = 10

For n = 2 To Cells(2, l)

If DateDiff("m", Cells(2, l), Date) > 120 Then

MsgBox ("DeliveryDateAlarm"), vbExclamation, "Alarm"

found = True

Exit For

End If

Next n

End Sub

Nytt inlägg
 2016-06-28 08:55
 
 Ändrad av Christian  på 2016-06-28 09:03:20
Hej hej

Börja med att göra om din masterdata till en tabell så blir det enklare för dig att koda. Döp sedan tabellen till myTable.
I din Vba editor ska du döpa bladet där din data ligger till wsData. (projekt-fönstret)

Därefter fungerar nedan kod.


Sub PrintIDs()

Dim i As Long
Dim vnt As Variant
Dim strToPrint As String

'Läser in din döpta tabell till en array, (vnt)
vnt = wsData.Range("mytable")

For i = 1 To UBound(vnt, 1)
'Testar om värdet i arrayen på plats i, 1 är ett datum.
If IsDate(vnt(i, 1)) Then
'Testar om värdet på plats i, 1 är större än 2006-01-01, det går att använda todayfunktionen här om man istället vill testa exakt 10 år bak i tiden från dagens datum
If (CDbl(vnt(i, 1)) > CDbl(#1/1/2006#)) Then
'Lägger till ID till sträng med radbryt för varje ID.
strToPrint = strToPrint & vbNewLine & vnt(i, 2)
End If
End If
Next i

if strToPrint <>"" then
MsgBox (strToPrint)
Else
MsgBox("Inga IDs är äldre än 10 år, alternativt så pekas värden ut felaktigt i koden")
End if

End Sub

För att få denna att fungera måste du se ändra så att dina värden ligger på rätt positioner i din array. Du kan testa detta med att lägga in bevakning på din array, och se var i arrayen dina värden ligger. vnt(i, 1) motsvarar för mig där datumen ligger, vnt(i, 2) där IDna ligger. Dina värden kommer ligga på andra positioner.

Mvh
Christian
Nytt inlägg
 2016-06-28 09:49
 

 Stort stort tack för svar! 

Jag får upp ett felmeddelande där det står "method or data member not found" med range markerat >>>      vnt = wsData.Range("mytable")

 

Vad kan felet vara? 

Nytt inlägg
 2016-06-28 11:47
 
Har du namngett ditt table i gränssnittet? längst upp till vänster i rutan..
Har du döpt bladet så att det i Projekt fönstret i editorn står wsData(Blad1)?

Nytt inlägg
 2016-06-28 12:11
 
 Ändrad av hassanikassan  på 2016-06-28 12:25:15

 Jag hade döpt fel blad till wsData! 

Det funkade till slut! Tack så sjukt mycket.

Återigen ett stort tack!

Nytt inlägg
 2016-06-29 07:05
 
 Ändrad av hassanikassan  på 2016-06-29 07:58:56

 Hej! 

Ännu en fråga: När ID-numrena kommer upp i rutan så blir det exempelvis 6.5435345E+23 osv istället för bara siffror... Jag har ändrat formatet i dokumentet så att detta inte skall hända men ändå så händer det i messageboxen? Hmm...

 

 

Och är detta korrekt ifall jag vill använda 10 år bakåt från dagens datum?

 

Dim p As Long

Dim vnt As Variant

Dim strToPrint As String

 

'Läser in din döpta tabell till en array, (vnt)

vnt = wsData.Range("mytable")

 

For p = 1 To UBound(vnt, 1)

'Testar om värdet i arrayen på plats i, 1 är ett datum.

If IsDate(vnt(p, 10)) Then

'Testar om värdet på plats i, 10 är äldre än 10 år

If (CDbl(vnt(p, 10)) < Date - 120) Then

'Lägger till ID till sträng med radbryt för varje ID.

strToPrint = strToPrint & vbNewLine & vnt(p, 4)

End If

End If

Next p

 

If strToPrint <> "" Then

MsgBox (strToPrint)

Else

MsgBox ("Inga IDs är äldre än 10 år")

End If

 

Kommer nämligen använda databasen flera år framåt och då är inte 2006-01-01 10 år bakåt längre. 

När jag gör som jag skrivit så får jag dock upp fler ID-nummer i rutan än de som är äldre än 10 år. Vad är felet här? Så frustrerande när man har så lite kunskap, haha. 

Nytt inlägg
 2016-06-30 14:35
 
Det är 365 dagar på ett år, därav - 3650. Cdbl använder man för att översätta ett datum till talet bakom datumet. Talet är en double.
CDbl(Date - 3650)

Har du formaterat din kolumn med ID som text så ska det fungera.
Nytt inlägg
 2016-07-01 07:47
 
 Ändrad av hassanikassan  på 2016-07-01 07:56:21

Tack så jättemycket för hjälpen! 

Nytt inlägg
 2016-07-01 12:29
 

 Hej igen! 

Just nu visas ju ID-numrena som en print. Går det att fixa så att dessa visas som någon form av textruta eller bild som går att spara istället? Eller kanske att alla numrena dyker upp på ett nytt worksheet oxå?

 

Mvh, Hassan i kassan 

Nytt inlägg
 2016-07-04 12:51
 
 Ändrad av Christian  på 2016-07-04 12:52:57
Hej hej

Lägg till ytterliggare en array och en long i dina dimmar (längst upp:

Dim vntIDs(1000, 1 to 1) as variant
Dim k as long

''''''''''''Därefter läser du in data till arrayen genom att ersätta tidigare loop med:

k = 1
For p = 1 To UBound(vnt, 1)

'''''''''''''Testar om värdet i arrayen på plats i, 1 är ett datum.

If IsDate(vnt(p, 10)) Then

'Testar om värdet på plats i, 10 är äldre än 10 år

If (CDbl(vnt(p, 10)) < Date - 120) Then

''''''''''populerar din nya array med ID

vntIDS(k) = vnt(p, 4)
k = k +1

End If

End If

Next p



''''''''''''Sedan längst ner i din sub anropar du en printfunktion:

PrintArray vntIDS, ActiveWorkbook.Worksheets("Något blad du vill klistra in till").[A1]

Sedan behöver du nedan sub för o skriva ut.

Sub PrintArray(vnt As Variant, Cl As Range)
Cl.Resize(UBound(Data, 1), UBound(Data, 2)) = Data
End Sub


Trevlig sommar!
/christian
Föregående Föregående
 
Nästa Nästa
ForumForumDiskussionerDiskussionerVBAVBAArray loopArray loop

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