Ik ben voor mijn werk bezig met het uitzoeken van een grote lijst (80000 rows) met gegevens van materialen in de rijen (ca. 12000 unieke materialen). Er zijn meerdere rows per materiaal, en we willen naar 1 row per materiaal toe. Het kan zijn dat er voor een bepaalde property van een materiaal (columns) meerdere waardes zijn. Hier is een voorbeeld van een stukje uit de sheet:
Ik heb nu de volgende macro gemaakt. Ik ben niet zo bekend met VBA, maar ben druk lerende
Wat dit doet is alle waardes voor een bepaalde property van een materiaal in een array zetten (als ze niet leeg zijn) en dan die waarde naar een andere sheet schrijven. Vooralsnog even alleen voor de materialen die maar 1 property hebben, maar hij moet dus uiteindelijk als er meerdere zijn die ook gaan vergelijken en als ze hetzelfde zijn schrijven.
PROBLEEM: als ik het probeer te draaien geeft ie een 'Runtime error 91: Object variable or with block variable not set'. Ik heb geen idee waar dat aan ligt, is het iets inhoudelijks in mijn code? Ik heb al geprobeerd de twee object variables anders te doen, maar dat helpt niet.
| Material | Info record | Vendor |
| 22852 | ||
| 22852 | ||
| 22852 | 5300187148 | I0116 |
| 22852 | 5300187148 | I0116 |
| 22386 | ||
| 22386 | 5300187244 | |
| 22386 | Y0336 |
Ik heb nu de volgende macro gemaakt. Ik ben niet zo bekend met VBA, maar ben druk lerende
Wat dit doet is alle waardes voor een bepaalde property van een materiaal in een array zetten (als ze niet leeg zijn) en dan die waarde naar een andere sheet schrijven. Vooralsnog even alleen voor de materialen die maar 1 property hebben, maar hij moet dus uiteindelijk als er meerdere zijn die ook gaan vergelijken en als ze hetzelfde zijn schrijven.
PROBLEEM: als ik het probeer te draaien geeft ie een 'Runtime error 91: Object variable or with block variable not set'. Ik heb geen idee waar dat aan ligt, is het iets inhoudelijks in mijn code? Ik heb al geprobeerd de twee object variables anders te doen, maar dat helpt niet.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| Sub TrimExtract()
Dim SourceCell As Object
Dim WorkRange As Range
Dim DestCell As Object
Dim SourceRow As Long
Dim NewMaterial As Boolean
Dim ArraySize As Integer
ArraySize = 0
Dim MaterialValues() As String
WorkRange = Worksheets("BRON1").Range("C2:C50")
DestCell = Worksheets("DOEL").Cells("C2")
' Loop voor iedere rij
For Each SourceCell In WorkRange
'SourceRow = SourceCell.Row
' Kijken of het een nieuw materiaal is
If Range("A" & (SourceCell.Row)).Value = "NEW" Then
NewMaterial = True
Else
NewMaterial = False
End If
' Als er een nieuw materiaal is, moet er eerst worden bekeken of er meerdere waardes in de array
' zitten en moet er iets naar DOEL worden geschreven
If NewMaterial = True Then
If ArraySize > 1 Then
'doe iets moeilijks om te bepalen welke we moeten schrijven
DestCell.Value = "meerdere waardes!"
'daarna moet de array weer op 0 worden gezet
ArraySize = 0
ReDim MaterialValues(ArraySize)
'ReDim MaterialValues(UBound(MaterialValues) - ArraySize)
Else
If ArraySize = 0 Then
'het is de eerste die we doen, dus we hoeven nog niets naar het doel te schrijven
Else
'er staat maar 1 cel met een waarde voor dit materiaal in het bronbereik, dus we kunnen die waarde schrijven
DestCell.Value = MaterialValues(1)
'daarna moet de array weer op 0 worden gezet
ArraySize = 0
ReDim MaterialValues(ArraySize)
'ReDim MaterialValues(UBound(MaterialValues) - ArraySize)
End If
End If
'de doelcel moet 1 naar onder worden gezet
DestCell = DestCell.Offset(1, 0)
Else
' Als er geen nieuw materiaal is, schrijf dan de volgende waarde naar de array als de broncel niet leeg is
If SourceCell <> "" Then
ReDim Preserve MaterialValues(ArraySize)
MaterialValues(ArraySize) = SourceCell.Value
End If
End If
Next SourceCell
End Sub |
There's so much comedy on television. Does that cause comedy in the streets?