praegune kellaaeg 19.06.2025 06:58:16
|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
|
lall
HV vaatleja
liitunud: 16.08.2006
|
17.11.2008 09:44:01
vb(a) koodis viga. |
|
|
Tere.
Probleem järgmine.
See vba võtab sheet1'lt tulbast C ühe koodi, ning otsib sellele vastet sheet2'lt. Ning kui leiab, siis teeb omad asjad ära (ehk siis võtab sheet1'lt otsitavalt koodilt samalt realt vastava väärtuse, ning asendab selle sheet2'l oleva koodi väärtusega[pole oluline]).
Kui tulbast C võetud koodile vastust sheet2'lt ei leita, teeb sheet2'le uue rea, kus kõik peale 2 tulba on fixeeritud väärtused. Teised kaks - üks on kood millele vastet ei leita, ning teine sellele vastav väärtus.(pole ka oluline)
AGA, see peaks toimina hoopis nii, et:
võtma sheet1'lt tulbast C koodi ja otsima sellele vastet sheet2'lt. Kui ei leia [mitte ei rutta uut rida sheet2'le tegema, vaid:] siis võtab esimese alternatiivkoodi tulbast E. [Põhikood on tulbas C ja alternatiivid tulpades E:M]. Kui tulbast E ka ei leia midagi, siis otsima edasi kuni vastava rea viimase alternatiivini.
Kui ikka veel pole leitud (siis põhikoodile ega ühelegi sellele vastavale alternatiivile) vastust sheet2'lt - alles SIIS tegema uue rea sheet2 lõppu.
Kõik see on siin koodis olemas, kuid ainuke viga ongi see, et see vba ei loopi läbi vastava rea, vaid kontrollib vaid esimest koodi.
Private Sub convert_new_pdt()
Dim a, i As Long, x As Long, b()
Dim ColA_H, myKeys, myItems, myCount As Long
'fikseeritud tulpade väärtused
ColA_H = Array("F", "20081111", "1111", "260001", "999999", "1", "2", "0")
With Sheets("sheet1")
a = .Range("a6", .Range("a" & Rows.Count).End(xlUp)).Resize(, 24).Value
End With
With CreateObject("Scripting.Dictionary")
.CompareMode = vbTextCompare
For i = 1 To UBound(a, 1)
'vahemik, kus koodid asuvad
For ii = 3 To 13
'KAS SIIN ON VIGA??
If (ii <> 4) * (a(i, ii) <> "") Then .Item(a(i, ii)) = a(i, 24)
Next
Next
With Sheets("sheet2")
'mittefixeeritud tulbad(kood[i], ning sellele vastav väärtus[k])
x = .Range("i" & Rows.Count).End(xlUp).Row
a = .Range("i1:i" & x).Value
b = .Range("k1:k" & x).Value
End With
For i = 1 To UBound(a, 1)
If .exists(a(i, 1)) Then
b(i, 1) = .Item(a(i, 1))
.Remove (a(i, 1))
End If
Next
Sheets("sheet2").Range("k1").Resize(UBound(a, 1)).Value = b
If .Count = 0 Then Exit Sub
myKeys = .keys: myItems = .items: myCount = .Count: x = UBound(a, 1)
End With
With Sheets("sheet2").Range("a" & UBound(a, 1) + 1).Resize(myCount)
.Resize(, 8).Value = ColA_H
.Offset(, 8).Value = Application.Transpose(myKeys)
.Offset(, 9).Value = 0
.Offset(, 10).Value = Application.Transpose(myItems)
.Offset(, 11).Value = 0
End With
End Sub |
On siin mõnda tegijat, kes viitsiks/suudaks selle ära parandada?
Kui on küsimusi - vastan hea meelega!
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
17.11.2008 10:40:38
|
|
|
Ütlen ausalt, minu jaoks jäi see kood küll natuke segaseks.
Pakuks alternatiiviks sellise variandi:
Function vaste_lehel_2(v22rtus) As Boolean
Dim i As Integer
i = 0
vaste_lehel_2 = False
With Sheets(2)
Do
i = i + 1
lahter = Cells(i, 1).Value
If lahter = v22rtus Then
vaste_lehel_2 = True
Exit Function
End If
Loop Until lahter = ""
End With
End Function
Sub mingi_asi()
Dim ReaNumber As Integer
ReaNumber = 0
Do
ReaNumber = ReaNumber + 1
koodilahter = Cells(ReaNumber, 3).Value
If vaste_lehel_2(koodilahter) Then
'Teeb oma vajalikud asjad ära
Else
For i = 5 To 13
If vaste_lehel_2(Cells(ReaNumber, i)) Then
'Teeb taas vajalikud asjad
Exit For
Else
if i = 13 then 'viimane lahter
'Teeb Sheet2 peale uue rea
end if
End If
Next i
End If
Loop Until koodilahter = ""
End Sub |
Kuna ma hästi aru ei saanud (ja süveneda ei viitsinud), mis lahtri sisu kuhu täpselt tõstma peab, siis märkisin nende funktsioonide kohad lihtsalt kommentaariga. Minu koodis on ka eelduseks see, et vastet otsitakse Sheet2 esimesest veerust.
|
|
Kommentaarid: 36 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
35 |
|
tagasi üles |
|
 |
lall
HV vaatleja
liitunud: 16.08.2006
|
17.11.2008 11:14:06
|
|
|
infidel kirjutas: |
Ütlen ausalt, minu jaoks jäi see kood küll natuke segaseks.
Pakuks alternatiiviks sellise variandi:
Function vaste_lehel_2(v22rtus) As Boolean
Dim i As Integer
i = 0
vaste_lehel_2 = False
With Sheets(2)
Do
i = i + 1
lahter = Cells(i, 1).Value
If lahter = v22rtus Then
vaste_lehel_2 = True
Exit Function
End If
Loop Until lahter = ""
End With
End Function
Sub mingi_asi()
Dim ReaNumber As Integer
ReaNumber = 0
Do
ReaNumber = ReaNumber + 1
koodilahter = Cells(ReaNumber, 3).Value
If vaste_lehel_2(koodilahter) Then
'Teeb oma vajalikud asjad ära
Else
For i = 5 To 13
If vaste_lehel_2(Cells(ReaNumber, i)) Then
'Teeb taas vajalikud asjad
Exit For
Else
'Teeb Sheet2 peale uue rea
End If
Next i
End If
Loop Until koodilahter = ""
End Sub |
Kuna ma hästi aru ei saanud (ja süveneda ei viitsinud), mis lahtri sisu kuhu täpselt tõstma peab, siis märkisin nende funktsioonide kohad lihtsalt kommentaariga. Minu koodis on ka eelduseks see, et vastet otsitakse Sheet2 esimesest veerust. |
Ma siis seletan täpselt ära kuidas lehed välja näevad ning mis täpselt toimuma peab.
-----------------------------------------------------------------------------------------------------------------------------------
Sheet1 sisaldab mul tohutut hinnikut andmeid (kuni paarsada tuhat rida, xl 2007. seega vajan kiireid koode, mis kasutaks võimalikult vähe loope ja selectimist).
Sheet1 tulpades c, e:m on koodid, kus tulp C sisaldab põhikoodi ning tulbad e:m alternatiivkoode.[kasutada vba's]
Sheet1 tulp W sisaldab väärtusi(paranduste lahter)[pole vba'le vajalik]
Sheet1 tulp X sisaldab formaaditud väärtust, mis tuleneb tulbast W. [seda tulpa tuleb kasutada vba's]
---
Sheet2 tulp i sisaldab koodi - sama kood mis on sheet1'l ÜHES nendes tulpadest: c, e:m.
Sheet2 tulp k sisaldab koodile vastavat väärtust - ning see väärtus tuleb asendada sellega, mis on sheet1'l tulbas X [kood seob neid ridu/väärtusi]
Näide:
sheet1:
Column C Column X
11223344 1312
Sheet2:
Column C Column X
11223344 999
Ning peale vba'd peaks 999 olema asendatud väärtusega 1312.
Nüüd läheb aga asi keerulisemaks:
Kui kood mis on võetud sheet1'lt tulbast C ei leia vastust Sheet2'lt tulbast i, siis peab vba võtma mitte uuelt realt uue koodi, vaid esimese alternatiivkoodi samalt realt(alternatiivid on siis tuplades e:m).
Ning kui on olemas vastus sheet2'l siis asendama selle väärtuse. Lihtne.
Kui aga ikka veel, olles läbi otsitud nii põhikood kui ka kõik alternatiivid pole vastust - siis tuleb teha sheet2'le uus rida kus on kõik peale nende 2 tulba (i ja k) fikseeritud. Tulp i peab sisaldama selle rea põhikoodi kust millele vastust ei leitud ning tulp k peab sisaldama sellele koodile vastavat väärtust.
Seega - sheet2 sisaldab 2 sarnasust sheet1'ga - tulpa i ja k. tulp i sisaldab koodi [kas siis põhi või üht alternatiivi] ning tulp K sisaldab sellele vastavat väärtust.
Ja siit probleem:
Praegu minu kood teeb 99% nii nagu vaja - ainult - see ei arvesta alternatiivkoodidega. Ehk - kui tulbast C võetud kood leiab vastuse sheet2'lt on kõik korras(väärtus asendatakse).
Kui aga tulba C koodile vastust ei leita, siis ta mitte ei otsi edasi läbi alternatiivide vaid teeb juba uue rea. Ning see ei sobi mitte kuidagi.
Selleasemel teeb ta mitu uut rida sheet2'le - näiteks kui põhikoodile vastust ei leita sheet2'lt, aga ühele alternatiivile oleks leidnud kui oleks sellega arvestatud, siis on olemas nii alternatiivkood ja selle väärtus sheet2l, kui ka tehtud põhikoodiga rida sheet2'l. [Tekib dublikaat]
-----
Kogu see pikk jutt on kokkutõmmatuna tegelikult päris lihtne, kuid minu pea enam sellele peale ei hakka.
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
17.11.2008 11:54:31
|
|
|
Function vaste_lehel_2(kood, v22rtus) As Boolean
Dim i As Integer
i = 0
vaste_lehel_2 = False
With Sheets(2)
Do
i = i + 1
lahter = Cells(i, 9).Value
If lahter = kood Then
Cells(i, 11).Value = v22rtus
vaste_lehel_2 = True
Exit Function
End If
Loop Until lahter = ""
End With
End Function
Sub mingi_asi()
With Sheets(1)
Dim ReaNumber As Integer
ReaNumber = 0
Do
ReaNumber = ReaNumber + 1
koodilahter = Cells(ReaNumber, 3).Value
v22rtuse_lahter = Cells(ReaNumber, 24).Value
If Not vaste_lehel_2(koodilahter, v22rtuse_lahter) Then 'Teeb oma vajalikud asjad funktsiooniga ära
For i = 5 To 13
If vaste_lehel_2(Cells(ReaNumber, i).Value, v22rtuse_lahter) Then 'Teeb taas vajalikud asjad funktsiooni käigus
Exit For
Else
If i = 13 Then 'viimane lahter
lisa_kirje_teisele_lehele Cells(ReaNumber, 3).Value, v22rtuse_lahter
'Teeb Sheet2 peale uue rea
End If
End If
Next i
End If
Loop Until koodilahter = ""
End With
End Sub
Sub lisa_kirje_teisele_lehele(kood, v22rtus)
With Sheets(2)
Dim i As Integer
Do
i = i + 1
Loop Until Cells(i, 1).Value = ""
Cells(i, 1).Value = "F" 'ColA_H = Array("F", "20081111", "1111", "260001", "999999", "1", "2", "0")
Cells(i, 2).Value = "20081111"
Cells(i, 3).Value = "1111"
Cells(i, 4).Value = "260001"
Cells(i, 5).Value = "999999"
Cells(i, 6).Value = "1"
Cells(i, 7).Value = "2"
Cells(i, 8).Value = "0"
Cells(i, 9).Value = kood
Cells(i, 11).Value = v22rtus
End With
End Sub |
Äkki niimoodi?
|
|
Kommentaarid: 36 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
35 |
|
tagasi üles |
|
 |
lall
HV vaatleja
liitunud: 16.08.2006
|
17.11.2008 12:32:52
|
|
|
infidel kirjutas: |
Function vaste_lehel_2(kood, v22rtus) As Boolean
Dim i As Integer
i = 0
vaste_lehel_2 = False
With Sheets(2)
Do
i = i + 1
lahter = Cells(i, 9).Value
If lahter = kood Then
Cells(i, 11).Value = v22rtus
vaste_lehel_2 = True
Exit Function
End If
Loop Until lahter = ""
End With
End Function
Sub mingi_asi()
With Sheets(1)
Dim ReaNumber As Integer
ReaNumber = 0
Do
ReaNumber = ReaNumber + 1
koodilahter = Cells(ReaNumber, 3).Value
v22rtuse_lahter = Cells(ReaNumber, 24).Value
If Not vaste_lehel_2(koodilahter, v22rtuse_lahter) Then 'Teeb oma vajalikud asjad funktsiooniga ära
For i = 5 To 13
If vaste_lehel_2(Cells(ReaNumber, i).Value, v22rtuse_lahter) Then 'Teeb taas vajalikud asjad funktsiooni käigus
Exit For
Else
If i = 13 Then 'viimane lahter
lisa_kirje_teisele_lehele Cells(ReaNumber, 3).Value, v22rtuse_lahter
'Teeb Sheet2 peale uue rea
End If
End If
Next i
End If
Loop Until koodilahter = ""
End With
End Sub
Sub lisa_kirje_teisele_lehele(kood, v22rtus)
With Sheets(2)
Dim i As Integer
Do
i = i + 1
Loop Until Cells(i, 1).Value = ""
Cells(i, 1).Value = "F" 'ColA_H = Array("F", "20081111", "1111", "260001", "999999", "1", "2", "0")
Cells(i, 2).Value = "20081111"
Cells(i, 3).Value = "1111"
Cells(i, 4).Value = "260001"
Cells(i, 5).Value = "999999"
Cells(i, 6).Value = "1"
Cells(i, 7).Value = "2"
Cells(i, 8).Value = "0"
Cells(i, 9).Value = kood
Cells(i, 11).Value = v22rtus
End With
End Sub |
Äkki niimoodi? |
Oeh, ei funka mitte.
Praegu pea liiga paks et edasi mõelda..kontrollin pärast ja vaatan kas saan pihta mis kus valesti.
Aga tänud, et viitsisid vaadata - tavaliselt ehmatatakse pika jutu ja seletamise peale täitsa ära.
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
infidel
HV kasutaja

liitunud: 31.01.2004
|
17.11.2008 12:53:31
|
|
|
Function vaste_lehel_2(kood, v22rtus) As Boolean
Dim i As Integer
i = 0
vaste_lehel_2 = False
Do
i = i + 1
lahter = Worksheets(2).Cells(i, 9).Value
If lahter = kood And lahter <> "" Then
Worksheets(2).Cells(i, 11).Value = v22rtus
vaste_lehel_2 = True
Exit Function
End If
Loop Until lahter = ""
End Function
Sub mingi_asi()
Dim ReaNumber As Integer
ReaNumber = 0
Do
ReaNumber = ReaNumber + 1
koodilahter = Worksheets(1).Cells(ReaNumber, 3).Value
v22rtuse_lahter = Worksheets(1).Cells(ReaNumber, 24).Value
If koodilahter <> "" Then
If Not vaste_lehel_2(koodilahter, v22rtuse_lahter) Then 'Teeb oma vajalikud asjad funktsiooniga ära
For i = 5 To 13
If vaste_lehel_2(Worksheets(1).Cells(ReaNumber, i).Value, v22rtuse_lahter) Then 'Teeb taas vajalikud asjad funktsiooni käigus
Exit For
Else
If i = 13 Then 'viimane lahter
lisa_kirje_teisele_lehele Worksheets(1).Cells(ReaNumber, 3).Value, v22rtuse_lahter
'Teeb Sheet2 peale uue rea
End If
End If
Next i
End If
End If
Loop Until koodilahter = ""
Exit Sub
End Sub
Sub lisa_kirje_teisele_lehele(kood, v22rtus)
Dim i As Integer
Do
i = i + 1
Loop Until Worksheets(2).Cells(i, 1).Value = ""
Worksheets(2).Cells(i, 1).Value = "F" 'ColA_H = Array("F", "20081111", "1111", "260001", "999999", "1", "2", "0")
Worksheets(2).Cells(i, 2).Value = "20081111"
Worksheets(2).Cells(i, 3).Value = "1111"
Worksheets(2).Cells(i, 4).Value = "260001"
Worksheets(2).Cells(i, 5).Value = "999999"
Worksheets(2).Cells(i, 6).Value = "1"
Worksheets(2).Cells(i, 7).Value = "2"
Worksheets(2).Cells(i, 8).Value = "0"
Worksheets(2).Cells(i, 9).Value = kood
Worksheets(2).Cells(i, 11).Value = v22rtus
End Sub
|
Tuleb välja, et koodi tuleb ikka katsetada ka natuke. Tekitasin mõned andmed ja leidsin päris mitu kahtlast kohta. Aga nüüdne variant peaks toimima.
|
|
Kommentaarid: 36 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
35 |
|
tagasi üles |
|
 |
lall
HV vaatleja
liitunud: 16.08.2006
|
17.11.2008 13:48:11
|
|
|
infidel kirjutas: |
Function vaste_lehel_2(kood, v22rtus) As Boolean
Dim i As Integer
i = 0
vaste_lehel_2 = False
Do
i = i + 1
lahter = Worksheets(2).Cells(i, 9).Value
If lahter = kood And lahter <> "" Then
Worksheets(2).Cells(i, 11).Value = v22rtus
vaste_lehel_2 = True
Exit Function
End If
Loop Until lahter = ""
End Function
Sub mingi_asi()
Dim ReaNumber As Integer
ReaNumber = 0
Do
ReaNumber = ReaNumber + 1
koodilahter = Worksheets(1).Cells(ReaNumber, 3).Value
v22rtuse_lahter = Worksheets(1).Cells(ReaNumber, 24).Value
If koodilahter <> "" Then
If Not vaste_lehel_2(koodilahter, v22rtuse_lahter) Then 'Teeb oma vajalikud asjad funktsiooniga ära
For i = 5 To 13
If vaste_lehel_2(Worksheets(1).Cells(ReaNumber, i).Value, v22rtuse_lahter) Then 'Teeb taas vajalikud asjad funktsiooni käigus
Exit For
Else
If i = 13 Then 'viimane lahter
lisa_kirje_teisele_lehele Worksheets(1).Cells(ReaNumber, 3).Value, v22rtuse_lahter
'Teeb Sheet2 peale uue rea
End If
End If
Next i
End If
End If
Loop Until koodilahter = ""
Exit Sub
End Sub
Sub lisa_kirje_teisele_lehele(kood, v22rtus)
Dim i As Integer
Do
i = i + 1
Loop Until Worksheets(2).Cells(i, 1).Value = ""
Worksheets(2).Cells(i, 1).Value = "F" 'ColA_H = Array("F", "20081111", "1111", "260001", "999999", "1", "2", "0")
Worksheets(2).Cells(i, 2).Value = "20081111"
Worksheets(2).Cells(i, 3).Value = "1111"
Worksheets(2).Cells(i, 4).Value = "260001"
Worksheets(2).Cells(i, 5).Value = "999999"
Worksheets(2).Cells(i, 6).Value = "1"
Worksheets(2).Cells(i, 7).Value = "2"
Worksheets(2).Cells(i, 8).Value = "0"
Worksheets(2).Cells(i, 9).Value = kood
Worksheets(2).Cells(i, 11).Value = v22rtus
End Sub
|
Tuleb välja, et koodi tuleb ikka katsetada ka natuke. Tekitasin mõned andmed ja leidsin päris mitu kahtlast kohta. Aga nüüdne variant peaks toimima. |
Ikka ei,kuid
katsetan edasi ja annan teada.
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
 |
|
lisa lemmikuks |
|
|
sa ei või postitada uusi teemasid siia foorumisse sa ei või vastata selle foorumi teemadele sa ei või muuta oma postitusi selles foorumis sa ei või kustutada oma postitusi selles foorumis sa ei või vastata küsitlustele selles foorumis sa ei saa lisada manuseid selles foorumis sa võid manuseid alla laadida selles foorumis
|
|
Hinnavaatlus ei vastuta foorumis tehtud postituste eest.
|