Excel, makro - pro ruzny zdrojovy soubor Vyřešeno

Programy pro práci v kanceláři (Word, Excel, Access…=>Office)

Moderátor: Mods_senior

navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel, makro - pro ruzny zdrojovy soubor

Příspěvekod navstevnik » 02 srp 2010 17:40

No dobre, jak myslis.
V sesitech pok_dat a pok_file je predpokladno, ze ve 4. radku jsou hlavicky sloupcu a zaznamy zacinaji v 5. radku. Nutno dodrzet zejmena v cilovych souborech typu pok_file.xls, ktere jsou ciste datove bez procedur VBA.
Nize uvedenou proceduru vloz v editoru VBA do standardniho modulu v sesitu pok_dat.xls, volej z menu (nabidka Nastroje>Makro>Makra...>...) nebo klavesovou zkratkou.
Po spusteni je zobrazen pozadavek na vlozeni nazvu souboru typu pok_file.xls s prednastavenou cestou (tentyz adresar jako u pok_dat), muzes zapsat jinou.
Dale je zobrazen pozadavek na vlozeni jmena listu v souboru pok_file. Pokud budou mit tyto soubory pouze jeden list, uprav zmenou v zaremovani casti procedury (oznaceno v procedure, cast cilovy list).
Hodnoty Active number jsou prirazeny do vsech zaznamu, pro ktere byly nalezeny, tak jak jsi drive uvedl (30.7.).
Cilovy soubor je na konci procedury uzavren.

Kód: Vybrat vše

Option Explicit

Sub FindAndCopy()
' source
  Dim SWsht As Worksheet, SBlk As Range, SCll As Range, STmp As String
  ' target
  Dim TPathFile As String, TWbk As Workbook, TWshtN As String
  Dim TWsht As Worksheet, TBlk As Range, TCll As Range
  ' support
  Dim Tmp As String, Tmp090 As String, FrstAddr As String

  ' zdrojovy soubor a list
  Set SWsht = Workbooks("pok_dat.xls").Worksheets("list1")
  ' zdrojovy blok pro hledane hodnoty, sloupec B:B, overeni pritomnosti dat
  With SWsht
    Set SBlk = .Range("b4:b" & .Cells(Rows.Count, 2).End(xlUp).Row)
  End With
  If SBlk.Resize(1, 1).Offset(SBlk.Rows.Count - 1, 0).Value = vbNullString Then
    MsgBox "Na listu: '" & SWsht.Name & "' nejsou data"
    GoTo Err1
  End If
  ' cilovy soubor:
  TPathFile = Application.InputBox("Zadej disk, cestu a nazev ciloveho souboru" & vbCr & vbCr _
      & "Vzor: Disk:\adresar\nazev.xls", Default:=Application.ActiveWorkbook.Path & "\", Type:=2)
  If TPathFile = "False" Then Exit Sub  ' storno vraci "False"
  On Error Resume Next
  Set TWbk = Workbooks.Open(TPathFile)  ' otevrit
  If Err.Number <> 0 Then
    MsgBox "Chyba v zadani ciloveho souboru - disk|cesta|nazev:" & vbCr & vbCr & TPathFile
    GoTo Err1
  End If
  ' list v cilovem souboru:
  ''*je pouze jeden***********
  '  Set TWsht = TWbk.ActiveSheet
  ''*nutno vybrat z vice******
  TWshtN = Application.InputBox("Zadej nazev ciloveho listu", Type:=2)
  If TWshtN = "False" Then GoTo Err2
  Set TWsht = TWbk.Worksheets(TWshtN)
  If Err.Number <> 0 Then
    MsgBox "List: '" & TWshtN & "' nebyl nalezen"
    GoTo Err2
  End If
  ''**************************
  On Error GoTo 0
  ' cilovy blok, sloupec B:B, overeni pritomnosti dat
  With TWsht
    Set TBlk = .Range("b5:b" & .Cells(Rows.Count, 2).End(xlUp).Row)
  End With
  If TBlk.Resize(1, 1).Offset(TBlk.Rows.Count - 1, 0).Value = vbNullString Then
    MsgBox "Na listu: '" & TWsht.Name & "' nejsou data"
    GoTo Err3
  End If
  ' prochazet TBlk a hledat prislusnou hodnotu ve zdroji SBlk
  Application.ScreenUpdating = False
  Tmp = vbNullString  ' vychozi hodnota pro docasne ulozeni TCll a hodnoty prave strany ze sloupce D:D
  For Each TCll In TBlk.Cells
    ' prava strana ze sloupce D:D
    Tmp090 = IIf(Len(TCll.Offset(0, 2).Value) = 13 And Right(TCll.Offset(0, 2).Value, 3) = "090", _
        "090", vbNullString)
    ' porovnani s ulozenou hodnotou, kdyz je TCll&Tmp090 odlisne, hledat ve zdroji
    If TCll.Value & Tmp090 <> Tmp Then
      Tmp = TCll.Value & Tmp090  ' ulozit novou hodnotu TCll&Tmp090
      ' hledat
      STmp = vbNullString  ' vychozi hodnota vysledku
      With SBlk
        Set SCll = .Find(TCll.Value, LookIn:=xlValues, LookAt:=xlWhole)
        If Not SCll Is Nothing Then  ' nalezeno
          FrstAddr = SCll.Address
          Do
            ' porovnani prave strany hodnoty v D:D s Tmp090
            If IIf(Len(SCll.Offset(0, 2).Value) = 13 And Right(SCll.Offset(0, 2).Value, 3) = "090", _
                "090", vbNullString) = Tmp090 Then
              ' vysledek ulozit pro pripadne opakovani TCll&Tmp090 v dalsim zaznamu
              STmp = SCll.Offset(0, 4).Value
              TCll.Offset(0, 4).Value = STmp  ' vlozit nalezene do sloupce F:F
              Exit Do  ' nalezeno, ukoncit hledani
            End If
            Set SCll = .FindNext(SCll)  ' hledat dalsi
          Loop While Not SCll Is Nothing And SCll.Address <> FrstAddr
        End If
      End With
    Else  ' pro opakujici se TCll&Tmp090 dosadit jiz nalezenou hodnotu
      TCll.Offset(0, 4).Value = STmp
    End If
  Next TCll
  Application.ScreenUpdating = True
  ' odstranit objektove promenne
  Set TCll = Nothing
  Set SCll = Nothing
Err3:
  Set TBlk = Nothing
  Set TWsht = Nothing
Err2:
  TWbk.Close True  ' zavrit zdrojovy soubor
  Set TWbk = Nothing
Err1:
  Set SBlk = Nothing
  Set SWsht = Nothing
End Sub


Pokud dospejes k zaveru, ze prece jenom je potreba nejake zmeny, tak se ozvi.

Reklama
valtr81
nováček
Příspěvky: 35
Registrován: červenec 10
Pohlaví: Muž
Stav:
Offline

Re: Excel, makro - pro ruzny zdrojovy soubor

Příspěvekod valtr81 » 02 srp 2010 21:15

V principu je to to co jsem chtěl, až na pár drobných úprav, ale má to jeden zásadní problém. A to že pro všechny řádky např "PLS" mají ve sloupci F stejnou hodnotu (tady uznávám, že jsem to asi špatně formuloval, ale každé Active number musí být jedninečné (tj. musí tam být vkopírován vzorec ze souboru pok_dat.xls, který zajistí patřičný tvar a jedinečnost)).
Dále jsem myslel, že to makro bude v souboru pok_file.xls (s tímto souborem se pracuje dál a dále slouží prozměnu jako zdrojový) a soubor pok_dat.xls bude zavřený a pouze jako zdroj.
A ještě tomuto makru FindAndCopy by mělo předcházet moje makro "Makro1_newITems", které načete data ze souboru pok_newITems_0xxx.xls (zde by se hodil ten výběrový formulář pro soubor).
Jinak samozřejmě díky za toto makro a případné změny.

navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel, makro - pro ruzny zdrojovy soubor

Příspěvekod navstevnik » 02 srp 2010 21:50

Pokud nenapis jasne a jednoznace, co ma byt vykonano, pak bohuzel dostanes vysledek, ktery se lisi od tvych predstav, ja bohuzel nemohu hadat co je zamerem. A z te hruzy, kterou nazyvas makry jsem tezko mohl vydedukovat, co ma byt vysledkem.
Dale, opakovane uvadis vzorec. To, co nazyvas vzorcem, je retezec znaku a nanejvys by se dalo rici, ze to je vzor neboli podminka. Kdyz jsem se ptal, zde shoda v Lang item nr. je druhou podminkou, tak jsem se vice mene dozvedel:
Pokud to stále nedokážu vysvětlit...

Takze pokud neni pro Lang group nr. shoda s Lang item nr. , nema byt doplneno Active number? Co se zaznamy, u kterych nebude toto cislo doplneno?
A dale uvadis, ze soubor pok_file po doplneni ma slouzit jako zdrojovy pro doplneni do dalsiho souboru nakopirovaneho z pok_newITems_0xxx.xls, coz ovsem znamena ze je nutno tento soubor pred timto nactenim ulozit pod nazvem pok_dat, stary soubor pok_dat jeste predtim prejmenovat na neco jineho (co?), a teprve pak nacit nova data, nebo to ma byt jinak? Zkus to popsat.

Neni problem to upravit do potrebneho tvaru a umistit do sesitu pok_file, stale zustavaji otazky k odpovedim, ale potrebuji uplne a jednoznacne zadani, nemohu si vymyslet a kristalove koule nefunguji.

valtr81
nováček
Příspěvky: 35
Registrován: červenec 10
Pohlaví: Muž
Stav:
Offline

Re: Excel, makro - pro ruzny zdrojovy soubor

Příspěvekod valtr81 » 03 srp 2010 09:35

Ok, pokusim se znova vysvětlit.
Mam soubory s daty pok_newITems_0629.xls (pok_newITems_0715.xls, pok_newITems_0xxx.xls, atd.). Data začínají na druhém řádku a končí na řádku x. Název listu není "List1".
Krok 1: Soubor pok_file.xls vyčistit od řádku 5 dolů (vše co je ukotveno příčkou (řádek 1-4 tam vždy bude) nechat). Naplnit daty ze souboru pok_newITems_0629.xls.

Krok 2: V souboru pok_file.xls naplnit sloupec F viz http://leteckaposta.cz/231263328 (výsledek v černém rámečku)

Pozn:
Takže pro všechna Lang group nr. obsahující Lang item nr. , naplnit Active number. Záznamy, u kterých nebude Lang item nr., přeskočit.

navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel, makro - pro ruzny zdrojovy soubor

Příspěvekod navstevnik » 03 srp 2010 16:09

Takze uz nejaky pokrok. Zustava jak naplnit sloupec F. Podle ukazky v naposledy uvedenych souborech je retezec do sloupce F:F zrejme skladan z nekolika casti, a ted prosim popis algoritmus tohoto skladani, odkud, podminka, pocet znaku kazde casti, pripadne vkladani mezer do retezce.

valtr81
nováček
Příspěvky: 35
Registrován: červenec 10
Pohlaví: Muž
Stav:
Offline

Re: Excel, makro - pro ruzny zdrojovy soubor

Příspěvekod valtr81 » 03 srp 2010 20:21

V souboru pok_file.xls filtruju položku Lang group nr. (buňka B4).
První v pořadí: LFH, v souboru pok_dat.xls si najdu ve sloupci B LFH, ze sloupce F pomocí ctrl+c zkopíruju buňku (vzorec) a vložím do souboru pok_file.xls do prvního řádku kde se vyskytuje LFH do sloupce F za pomocí ctrl+v a rozkopíruju buňku (vzorec) ručně na x řádků, ve kterých se LFH vyskytuje (tím že kopíruju vzorec zajistím jedinečnost Active number).
Druhý v pořadí: LGO, a stejný postup.
Třetí v pořadí: ...
atd. pro všechny položky Lang group nr. (pokud jsou tři tak tři, pokud jich je padesát tak padesát).

Tím, že hledám v souboru pok_dat.xls, tak ho mám otevřený, pokud to pro makro není důležité, bude lepší když bude zavřený.

Podmínek by se možná našlo víc, ale podstatná je v tuto chvíli pouze jedna: a to aby čísla, která končí na 090 byly s předponou SD a 090 na konci neměli (o tom jsem se už zmínil) viz např (0986019820090 > SD 0 986 019 820)

navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel, makro - pro ruzny zdrojovy soubor

Příspěvekod navstevnik » 04 srp 2010 07:48

Tak prece to slo, srozumitelne popsat, co je pozadovano.
Nize uvedenou proceduru vloz do souboru pok_file.xls, otestuj.
Zustava neosetren stav, kdy: "Záznamy, u kterých nebude Lang item nr., přeskočit." Tedy kdyz neni v pok_file.xls nebo v pok_dat.xls nebo v obou?

Kód: Vybrat vše

Option Explicit

Sub FindAndCopy()
' tento soubor
  Dim TFWsht As Worksheet, TFBlk As Range, TFCll As Range
  ' data
  Dim SWbk As Workbook, SWsht As Worksheet, SBlk As Range, SCll As Range
  ' novy soubor
  Dim NPathFile As String, NWbk As Workbook, NWshtN As String
  Dim NWsht As Worksheet, NBlk As Range
  ' support
  Dim FrstAddr As String, TmpFormula As String
  ' tento sesit, blok dat
  Set TFWsht = ActiveWorkbook.ActiveSheet
  With TFWsht
    Set TFBlk = .Range("A5:A" & .Cells(Rows.Count, 1).End(xlUp).Row)
    ' kdyz jsou zaznamy
    If TFBlk.Resize(1, 1).Offset(TFBlk.Rows.Count - 1, 0).Value <> vbNullString Then
      Set TFBlk = TFBlk.Resize(TFBlk.Rows.Count, 6)
    End If
  End With
  ' odstranit data z bloku A5:Fxx, nove definovat blok, format sloupcu
  TFBlk.ClearContents
  Set TFBlk = TFWsht.Range("a5")
  With TFWsht
    .Range("b:b,d:e").NumberFormat = "@"
    .Range("f:f").NumberFormat = "General"
  End With
  ' novy soubor, nacist data
  NPathFile = Application.InputBox("Zadej disk, cestu a nazev ciloveho souboru" & vbCr & vbCr _
      & "Vzor: Disk:\adresar\nazev.xls", Default:=Application.ActiveWorkbook.Path & "\", Type:=2)
  If NPathFile = "False" Then GoTo Err1  ' storno vraci "False"
  On Error Resume Next
  Set NWbk = Workbooks.Open(NPathFile)  ' otevrit
  If Err.Number <> 0 Then
    MsgBox "Chyba v zadani noveho souboru - disk|cesta|nazev:" & vbCr & vbCr & NPathFile
    GoTo Err1
  End If
  ' list v novem souboru:
  ''*je pouze jeden***********
  Set NWsht = NWbk.ActiveSheet
  ''*nutno vybrat z vice******
  '  NWshtN = Application.InputBox("Zadej nazev ciloveho listu", Type:=2)
  '  If NWshtN = "False" Then GoTo Err2
  '  Set NWsht = NWbk.Worksheets(NWshtN)
  '  If Err.Number <> 0 Then
  '    MsgBox "List: '" & TWshtN & "' nebyl nalezen"
  '    GoTo Err1
  '  End If
  ''**************************
  On Error GoTo 0
  ' novy blok, A2:Exx, overeni pritomnosti dat
  With NWsht
    Set NBlk = .Range("a2:a" & .Cells(Rows.Count, 1).End(xlUp).Row)
  End With
  If NBlk.Resize(1, 1).Offset(NBlk.Rows.Count - 1, 0).Value = vbNullString Then
    MsgBox "Na listu: '" & NWsht.Name & "' v souboru: '" & NWbk.Name & "' nejsou data"
    NWbk.Close False  ' zavrit novy soubor
    Set NBlk = Nothing
    GoTo Err1
  End If
  ' blok novych dat
  Set NBlk = NBlk.Resize(NBlk.Rows.Count, 5)
  ' redefinovat blok TFBlk, nacist data z noveho souboru, soubor zavrit
  Set TFBlk = TFBlk.Resize(NBlk.Rows.Count, 5)
  TFBlk.Value = NBlk.Value
  NWbk.Close False
  ' ostranit objektove promenne
  Set NBlk = Nothing
  Set NWsht = Nothing
  Set NWbk = Nothing
  ' otevrit zdrojovy soubor, list, blok dat, overit pritomnost dat
  On Error Resume Next
  Set SWbk = Workbooks.Open(Application.ActiveWorkbook.Path & "\" & "pok_dat.xls")
  If Err.Number <> 0 Then
    MsgBox "Datovy soubor nenalezen"
    GoTo Err1
  End If
  Set SWsht = SWbk.ActiveSheet
  With SWsht
    Set SBlk = .Range("b4:b" & .Cells(Rows.Count, 2).End(xlUp).Row)
  End With
  If SBlk.Resize(1, 1).Offset(SBlk.Rows.Count - 1, 0).Value = vbNullString Then
    MsgBox "Na listu: '" & SWsht.Name & "' v souboru: '" & SWbk.Name & "' nejsou data"
    GoTo Err2
  End If
  ' redefinovat blok TFBlk,prochazet TFBlk a hledat ve zdroji hodnoty ze sloupce F:F a vlozit
  Application.ScreenUpdating = False
  Set TFBlk = TFBlk.Resize(TFBlk.Rows.Count, 1).Offset(0, 1)
  TmpFormula = vbNullString
  For Each TFCll In TFBlk.Cells
    If TFCll.Offset(0, 2).Value <> vbNullString Then  ' sloupec D:D neni prazdny
      With SBlk
        Set SCll = .Find(TFCll.Value, LookIn:=xlValues, LookAt:=xlWhole)
        If Not SCll Is Nothing Then  ' nalezena prvni shoda ve sloupci B:B
          FrstAddr = SCll.Address
          Do
            ' shoda ve sloupcich D:D s ohledem na delku a zakonceni cisla - 13 znaku, "090"
            If IIf(Len(SCll.Offset(0, 2).Value) = 13 And Right(SCll.Offset(0, 2).Value, 3) = "090", _
                "090", vbNullString) = IIf(Len(TFCll.Offset(0, 2).Value) = 13 _
                And Right(TFCll.Offset(0, 2).Value, 3) = "090", "090", vbNullString) Then
              TmpFormula = SCll.Offset(0, 4).FormulaLocal  ' nacist vzorec z F:F
              ' identifikovat ve zdroji odkaz na sloupec, upravit odkazy v cili
              If InStr(TmpFormula, "D" & SCll.Row) > 0 Then
                TFCll.Offset(0, 4).FormulaLocal = Replace(TmpFormula, "D" & SCll.Row, "D" & TFCll.Row)
              ElseIf InStr(TmpFormula, "E" & SCll.Row) > 0 Then
                TFCll.Offset(0, 4).FormulaLocal = Replace(TmpFormula, "E" & SCll.Row, "E" & TFCll.Row)
              End If
              Exit Do  ' nalezeno, ukoncit hledani
            End If
            Set SCll = .FindNext(SCll)  ' hledat dal
          Loop While Not SCll Is Nothing And SCll.Address <> FrstAddr
        End If
      End With
    End If
  Next TFCll  ' dalsi zaznam
  Application.ScreenUpdating = True
  ' odstranit objektove promenne
  Set TFCll = Nothing
  Set SCll = Nothing
Err2:
  Set SBlk = Nothing
  Set SWsht = Nothing
  SWbk.Close True  ' zavrit zdrojovy soubor
  Set SWbk = Nothing
Err1:
  Set TFBlk = Nothing
  Set TFWsht = Nothing
End Sub

Pripadne prejmenovani souboru lze take doplnit.

valtr81
nováček
Příspěvky: 35
Registrován: červenec 10
Pohlaví: Muž
Stav:
Offline

Re: Excel, makro - pro ruzny zdrojovy soubor

Příspěvekod valtr81 » 04 srp 2010 20:40

Tak toto už je částečně dobré, ale funguje to pouze pro ten jeden soubor, který je uložený. Navíc to udělá chybu, že se ty data posunou až na 8 řádek. Dále nechápu co dělá "Zadej disk, cestu a nazev ciloveho souboru". Můj cílový soubor je ten pok_file.xls ve, kterém pracuji a pouštím makro, tak je zbytečný vytvářet jiný nebo na něj odkazovat.
Já osobně bych to rozdělil do několika maker a udělal pro každé tlačítko.
1. Smazat data.
2. Nahrát data ze zvoleného souboru.
3. FindAndCopy

Lang item nr. by měl být vždy, nezabýval bych se tím teď.

navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel, makro - pro ruzny zdrojovy soubor

Příspěvekod navstevnik » 04 srp 2010 21:23

Vyzva na zadani disku,... zustala neopravena z predchozi procedury, omlouvam se, bude opraveno na soubor s daty pok_new... V poznamkach v procedure bys zjistl, o co jde.

"...funguje to pouze pro ten jeden soubor...", uvedl jsi: "Krok 1: Soubor pok_file.xls vyčistit od řádku 5 dolů (vše co je ukotveno příčkou (řádek 1-4 tam vždy bude) nechat). Naplnit daty ze souboru pok_newITems_0629.xls.", tedy se jedna o jeden soubor.

"Navíc to udělá chybu, že se ty data posunou až na 8 řádek", uvedl jsi: "...pok_newITems_0xxx.xls, atd.). Data začínají na druhém řádku a končí na řádku x.", takze blok dat pocinaje druhym radkem je kopirovan z pok_new... do pok_file od pateho radku.

Rozdeleni na tri dilci procedury nedava smysl, tlacitko si muzes pridat sam (z Ovladaci prvky, nikoliv z Formulare).

Opraveno, vlozit do standardniho modulu v souboru pok_file.xls:

Kód: Vybrat vše

Option Explicit

Sub FindAndCopy()
' tento soubor
  Dim TFWsht As Worksheet, TFBlk As Range, TFCll As Range, TFRow As Long
  ' data
  Dim SWbk As Workbook, SWsht As Worksheet, SBlk As Range, SCll As Range, STFClmn As String, SRow As Long
  ' novy soubor
  Dim NPathFile As String, NWbk As Workbook, NWshtN As String
  Dim NWsht As Worksheet, NBlk As Range
  ' support
  Dim FrstAddr As String, TmpFormula As String, Tmp As String, Tmp090 As String

  ' tento sesit, blok dat
  Set TFWsht = ActiveWorkbook.ActiveSheet
  With TFWsht
    Set TFBlk = .Range("A5:A" & .Cells(Rows.Count, 1).End(xlUp).Row)
    ' kdyz jsou zaznamy
    If TFBlk.Resize(1, 1).Offset(TFBlk.Rows.Count - 1, 0).Value <> vbNullString Then
      Set TFBlk = TFBlk.Resize(TFBlk.Rows.Count, 6)
    End If
  End With
  ' odstranit data z bloku A5:Fxx, nove definovat blok, format sloupcu
  TFBlk.ClearContents
  Set TFBlk = TFWsht.Range("a5")
  With TFWsht
    .Range("b:b,d:e").NumberFormat = "@"
    .Range("f:f").NumberFormat = "General"
  End With
  ' novy soubor, nacist data
  NPathFile = Application.InputBox("Zadej disk, cestu a nazev souboru s daty pok_new..." & vbCr & vbCr _
      & "Vzor: Disk:\adresar\nazev.xls", Default:=Application.ActiveWorkbook.Path & "\", Type:=2)
  If NPathFile = "False" Then GoTo Err1  ' storno vraci "False"
  On Error Resume Next
  Set NWbk = Workbooks.Open(NPathFile)  ' otevrit
  If Err.Number <> 0 Then
    MsgBox "Chyba v zadani noveho souboru - disk|cesta|nazev:" & vbCr & vbCr & NPathFile
    GoTo Err1
  End If
  ' list v novem souboru:
  ''*je pouze jeden***********
  Set NWsht = NWbk.ActiveSheet
  ''*nutno vybrat z vice******
  '  NWshtN = Application.InputBox("Zadej nazev ciloveho listu", Type:=2)
  '  If NWshtN = "False" Then GoTo Err2
  '  Set NWsht = NWbk.Worksheets(NWshtN)
  '  If Err.Number <> 0 Then
  '    MsgBox "List: '" & TWshtN & "' nebyl nalezen"
  '    GoTo Err1
  '  End If
  ''**************************
  On Error GoTo 0
  ' novy blok, A2:Exx, overeni pritomnosti dat
  With NWsht
    Set NBlk = .Range("a2:a" & .Cells(Rows.Count, 1).End(xlUp).Row)
  End With
  If NBlk.Resize(1, 1).Offset(NBlk.Rows.Count - 1, 0).Value = vbNullString Then
    MsgBox "Na listu: '" & NWsht.Name & "' v souboru: '" & NWbk.Name & "' nejsou data"
    NWbk.Close False  ' zavrit novy soubor
    Set NBlk = Nothing
    GoTo Err1
  End If
  ' blok novych dat
  Set NBlk = NBlk.Resize(NBlk.Rows.Count, 5)
  ' redefinovat blok TFBlk, nacist data z noveho souboru, soubor zavrit
  Set TFBlk = TFBlk.Resize(NBlk.Rows.Count, 5)
  TFBlk.Value = NBlk.Value
  NWbk.Close False
  ' ostranit objektove promenne
  Set NBlk = Nothing
  Set NWsht = Nothing
  Set NWbk = Nothing
  ' otevrit zdrojovy soubor, list, blok dat, overit pritomnost dat
  On Error Resume Next
  Set SWbk = Workbooks.Open(Application.ActiveWorkbook.Path & "\" & "pok_dat.xls")
  If Err.Number <> 0 Then
    MsgBox "Datovy soubor nenalezen"
    GoTo Err1
  End If
  Set SWsht = SWbk.ActiveSheet
  With SWsht
    Set SBlk = .Range("b4:b" & .Cells(Rows.Count, 2).End(xlUp).Row)
  End With
  If SBlk.Resize(1, 1).Offset(SBlk.Rows.Count - 1, 0).Value = vbNullString Then
    MsgBox "Na listu: '" & SWsht.Name & "' v souboru: '" & SWbk.Name & "' nejsou data"
    GoTo Err2
  End If
  ' redefinovat blok TFBlk,prochazet TFBlk a hledat ve zdroji hodnoty ze sloupce F:F a vlozit
  Application.ScreenUpdating = False
  Set TFBlk = TFBlk.Resize(TFBlk.Rows.Count, 1).Offset(0, 1)
  Tmp = vbNullString: TmpFormula = vbNullString  ' vychozi hodnoty
  For Each TFCll In TFBlk.Cells
    If TFCll.Offset(0, 2).Value <> vbNullString Then  ' sloupec D:D neni prazdny
      Tmp090 = IIf(Len(TFCll.Offset(0, 2).Value) = 13 _
      And Right(TFCll.Offset(0, 2).Value, 3) = "090", "090", vbNullString)  ' stav posl tri znaku
      If TFCll.Value & Tmp090 <> Tmp Then  ' rozdil proti predchozimu zaznamu, nalezt novou hodnotu ve zdroji
      Tmp = TFCll.Value & Tmp090  ' vlozit novou hodnotu
          With SBlk
          Set SCll = .Find(TFCll.Value, LookIn:=xlValues, LookAt:=xlWhole)
          If Not SCll Is Nothing Then  ' nalezena prvni shoda ve sloupci B:B
            FrstAddr = SCll.Address
            Do
              ' shoda ve sloupcich D:D zdroje a cile s ohledem na delku a zakonceni cisla - 13 znaku, "090"
              If IIf(Len(SCll.Offset(0, 2).Value) = 13 And Right(SCll.Offset(0, 2).Value, 3) = "090", _
                  "090", vbNullString) = Tmp090 Then
                TmpFormula = SCll.Offset(0, 4).FormulaLocal  ' nacist vzorec z F:F
                ' identifikovat ve zdroji odkaz na sloupec, upravit odkazy v cili, vlozit
                SRow = SCll.Row  ' radek ve zdroji
                If InStr(TmpFormula, "D" & SRow) > 0 Then
                  STFClmn = "D"  ' sloupec ve zdroji
                ElseIf InStr(TmpFormula, "E" & SRow) > 0 Then
                  STFClmn = "E"
                End If
                ' vlozit vzorec,zmena odkazu na radek v cili ve vzorci
                TFCll.Offset(0, 4).FormulaLocal = Replace(TmpFormula, STFClmn & SRow, STFClmn & TFCll.Row)
                Exit Do  ' nalezeno, ukoncit prohledavaci smycku Do - Loop
              End If
              Set SCll = .FindNext(SCll) ' hledat dal
            Loop While Not SCll Is Nothing And SCll.Address <> FrstAddr
          End If
        End With
      Else  ' shoda, lze vlozit do cile nalezeny vzorec, zmena odkazu na radek v cili
        TFCll.Offset(0, 4).FormulaLocal = Replace(TmpFormula, STFClmn & SRow, STFClmn & TFCll.Row)
      End If
    End If
  Next TFCll  ' dalsi zaznam
  Application.ScreenUpdating = True
  ' odstranit objektove promenne
  Set TFCll = Nothing
  Set SCll = Nothing
Err2:
  Set SBlk = Nothing
  Set SWsht = Nothing
  SWbk.Close True  ' zavrit zdrojovy soubor
  Set SWbk = Nothing
Err1:
  Set TFBlk = Nothing
  Set TFWsht = Nothing
End Sub

valtr81
nováček
Příspěvky: 35
Registrován: červenec 10
Pohlaví: Muž
Stav:
Offline

Re: Excel, makro - pro ruzny zdrojovy soubor

Příspěvekod valtr81 » 05 srp 2010 16:58

Tohle už vypadá lépe a funguje to pro různé zdroje.
Nicméně se tam vyskytují dvě chyby.
1. Vzorové soubory neobsahují data od sloupce G a dále, při ostrém provozu však obsahují a bohužel je to všechny smaže.
2. Databáze neobsahuje konkrétně dvě položky SEL a CAS a při doplnění sloupce F tam k některým řádkům nacpne nějaký vzorec.

navstevnik
Level 4
Level 4
Příspěvky: 1142
Registrován: srpen 08
Pohlaví: Nespecifikováno
Stav:
Offline

Re: Excel, makro - pro ruzny zdrojovy soubor

Příspěvekod navstevnik » 05 srp 2010 17:45

ad 1. Jak to vypada, tak jses nepoucitelny a neschopny zadat vychozi podklady komplexne. O nejakych sloupcich G a dale nebyla od tebe jakakoliv zminka. Jaky podklad, takovy vysledek, takze posli vzorovy soubor pok_new... se vsemi sloupci. Tech dalsich sloupcu bude vzdy stejny pocet?

ad 2. Pokud mam zjistit duvod, musis pribalit inkriminivany soubor pok_file.xls prave s temito "chybami".

Oba soubory zazipuj a pripoj jako prilohu sem na poradnu.

valtr81
nováček
Příspěvky: 35
Registrován: červenec 10
Pohlaví: Muž
Stav:
Offline

Re: Excel, makro - pro ruzny zdrojovy soubor

Příspěvekod valtr81 » 06 srp 2010 09:19

Pokud vím tak data byly ořezány na to nejnutnější s čím souvisí problém. Přikládám nový zdroj dat newITems_0628.xls a novy pok_file.xls. Data jsou až do sloupce BV a do řádku x.
V souboru pok_file_newITems_0628_vysledek.xls je označeno (žlutě) ve sloupci F několik buněk pro CES a SEL, které by měly být prázdné, protože v databázi se pro ně nevyskytují žádné hodnoty, přesto tam "něco" je.
http://leteckaposta.cz/704788925


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • EXCEL -jak otevřít 2 excel sobory abych je viděla současne a samostatně
    od Ketty02 » 30 srp 2024 21:19 » v Vše ostatní (sw)
    2
    4772
    od Riviera kid Zobrazit poslední příspěvek
    02 zář 2024 16:21
  • Přechod z Excel 21 na Excel 24
    od Snekment » 29 led 2025 13:46 » v Kancelářské balíky
    2
    12187
    od Snekment Zobrazit poslední příspěvek
    29 led 2025 15:05
  • Neznámý soubor
    od robin432 » 29 bře 2025 14:45 » v Programy ke stažení
    1
    4608
    od atari Zobrazit poslední příspěvek
    29 bře 2025 14:58
  • .pptx soubor ve formátu A4 Příloha(y)
    od uzivatelzacatecnik » 11 říj 2024 10:39 » v Kancelářské balíky
    3
    2752
    od uzivatelzacatecnik Zobrazit poslední příspěvek
    11 říj 2024 12:01
  • Pohoda a excel Příloha(y)
    od brownwld » 06 kvě 2025 17:28 » v Kancelářské balíky
    1
    4599
    od atari Zobrazit poslední příspěvek
    07 kvě 2025 09:41

Zpět na “Kancelářské balíky”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host