V souboru newITems_0628.xls je na radku 3572 zaznam s 13-timistnym Lang item nr koncicim "090", v pok_dat.xls neni odpovidajici zaznam IAT.
Kód: Vybrat vše
Option Explicit
Sub FindAndCopy()
' tento soubor
  Dim TFWbk As Workbook, TFWsht As Worksheet, TFBlk As Range, TFCll As Range, TFRow As Long
  ' data
  Dim SWbkN As String, SWbk As Workbook, SWsht As Worksheet, SBlk As Range, SCll As Range
  Dim 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
  ' nazev souboru s daty
  SWbkN = "pok_dat.xls"
  '
  ' tento sesit, blok zaznamu
  Set TFWbk = ActiveWorkbook
  Set TFWsht = TFWbk.ActiveSheet
  With TFWsht
    ' kdyz jsou zaznamy, definovat blok TFBlk (B5:Bxx) a zaznamy z bloku A5:BVxx odstranit, format sloupcu
    If .Range("b5").Value <> vbNullString Then
    Set TFBlk = .Range("b5:b" & .Cells(Rows.Count, 2).End(xlUp).Row)
      TFBlk.Resize(TFBlk.Rows.Count, 74).Offset(0, -1).ClearContents
      .Range("a:e, g:bv").NumberFormat = "@"
      .Range("f:f").NumberFormat = "General"  ' vlozene vzorce pro funkcnost vyzaduji tento format bunky
    End If
  End With
  ' redefinovat blok TFBlk (B5:Bxx->A5)
  Set TFBlk = TFWsht.Range("a5")
  '
  ' otevrit datovy soubor, list, blok zaznamu, overit pritomnost dat
  Application.ScreenUpdating = False
  On Error Resume Next
  Set SWbk = Workbooks.Open(Application.ActiveWorkbook.Path & "\" & SWbkN)
  If Err.Number <> 0 Then
    MsgBox "Datovy soubor: '" & SWbkN & "' nenalezen", vbOKOnly + vbExclamation
    GoTo Err1
  End If
  Set SWsht = SWbk.ActiveSheet
  With SWsht
    If .Range("b5").Value = vbNullString Then
      MsgBox "Na listu: '" & SWsht.Name & "' v souboru: '" & SWbk.Name & "' nejsou zaznamy", vbOKOnly + vbExclamation
      GoTo Err2
    End If
    Set SBlk = .Range("b5:b" & .Cells(Rows.Count, 2).End(xlUp).Row)
  End With
  ' redefinovat blok SBlk (B5:Bxx->B4:Bxx), metoda Find zacina hledat od druhe bunky vlevo nahore v bloku
  Set SBlk = SBlk.Resize(SBlk.Rows.Count + 1).Offset(-1, 0)
  Application.ScreenUpdating = True
  TFWbk.Activate
  '
  ' novy soubor, list, nacist zaznamy
  NPathFile = Application.InputBox("Zadej disk, cestu a nazev noveho souboru se zaznamy 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, vbOKOnly + vbExclamation
    GoTo Err2
  End If
  ' list v novem souboru:
  ''*je pouze jeden***********
  Set NWsht = NWbk.ActiveSheet
  ''*nutno vybrat z vice******
  '  NWshtN = Application.InputBox("Zadej nazev noveho listu", Type:=2)
  '  If NWshtN = "False" Then GoTo Err2
  '  Set NWsht = NWbk.Worksheets(NWshtN)
  '  If Err.Number <> 0 Then
  '    MsgBox "List: '" & TWshtN & "' nebyl nalezen", vbOKOnly + vbExclamation
  '    GoTo Err2
  '  End If
  ''**************************
  On Error GoTo 0
  ' novy blok, overeni pritomnosti zaznamu
  With NWsht
    Set NBlk = .Range("b2:b" & .Cells(Rows.Count, 2).End(xlUp).Row) ' blok ve sloupci B:B
  End With
  If NBlk.Resize(1, 1).Value = vbNullString Then
    MsgBox "Na listu: '" & NWsht.Name & "' v souboru: '" & NWbk.Name & "' nejsou zaznamy na druhem radku", _
        vbOKOnly + vbExclamation
    NWbk.Close False  ' zavrit novy soubor
    ' odstranit objektove promenne
    Set NWsht = Nothing
    Set NBlk = Nothing
    GoTo Err2
  End If
  ' prenest hodnoty z noveho souboru A2:Exx a G2:BVxx do TFWsht A5:Eyy a G5:BVyy
  TFBlk.Resize(NBlk.Rows.Count, 5).Value = NBlk.Resize(NBlk.Rows.Count, 5).Offset(0, -1).Value
  TFBlk.Resize(NBlk.Rows.Count, 68).Offset(0, 6).Value = NBlk.Resize(NBlk.Rows.Count, 68).Offset(0, 5).Value
  ' redefinovat blok TFBlk (A5->B5:Bxx)
  Set TFBlk = TFBlk.Resize(NBlk.Rows.Count, 1).Offset(0, 1)
  NWbk.Close False
  ' odstranit objektove promenne
  Set NBlk = Nothing
  Set NWsht = Nothing
  Set NWbk = Nothing
  '
  '  prochazet TFBlk a hledat v SBlk shodu ve sloupci B:B a vlozit vzorec z F:F
  Application.ScreenUpdating = False
  Tmp = vbNullString  ' vychozi hodnota shody pri nalezeni pozitivniho vysledku
  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 pri delce 13 znaku
      If TFCll.Value & Tmp090 <> Tmp Then  ' rozdil proti predchozimu zaznamu, nalezt novou hodnotu v SBlk
        With SBlk
          Set SCll = .Find(TFCll.Value, LookIn:=xlValues, LookAt:=xlWhole)
          If Not SCll Is Nothing Then  ' nalezena prvni shoda ve sloupci B:B v datovem souboru
            FrstAddr = SCll.Address
            Do
              ' shoda ve sloupcich D:D SCll a TFCll s ohledem na delku - 13 znaku a zakonceni - "090"
              If IIf(Len(SCll.Offset(0, 2).Value) = 13 And Right(SCll.Offset(0, 2).Value, 3) = "090", _
                  "090", vbNullString) = Tmp090 Then
                ' vzorec do F:F TFBlk
                TmpFormula = SCll.Offset(0, 4).FormulaLocal  ' nacist vzorec z F:F
                SRow = SCll.Row  ' radek v SBLK, ulozeno pro pripadne se opakujici shodu v dalsim zaznamu
                ' identifikovat ve vzorci odkaz na bunku Dxx nebo Exx, upravit odkazy pro vlozeni, vlozit
                STFClmn = vbNullString
                If InStr(TmpFormula, "D" & SRow) > 0 Then
                  STFClmn = "D"  ' sloupec v SBlk, ulozeno pro pripadne se opakujici shodu v dalsim zaznamu
                ElseIf InStr(TmpFormula, "E" & SRow) > 0 Then
                  STFClmn = "E"
                End If
                If STFClmn <> vbNullString Then ' identifikovan odkaz na bunku Dxx nebo Exx
                  ' vlozit vzorec,zmena odkazu na radek v TFBlk ve vzorci
                  TFCll.Offset(0, 4).FormulaLocal = Replace(TmpFormula, STFClmn & SRow, STFClmn & TFCll.Row)
                  Tmp = TFCll.Value & Tmp090  ' vlozit novou hodnotu pro pripadne se opakujici shodu v dalsim zaznamu
                  Exit Do  ' nalezeno, ukoncit prohledavaci smycku Do - Loop
                End If
              End If
              Set SCll = .FindNext(SCll)  ' hledat dal, zda bude nalezena hodnota v B:B a bude shoda v D:D (zakonceni)
            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
  TFWsht.UsedRange.Columns.AutoFit ' upravit sirku sloupcu
  Application.ScreenUpdating = True
  TFWbk.Save ' ulozit tento soubor
  MsgBox "Doplneni zaznamu uspesne probehlo", vbOKOnly + vbInformation
  ' odstranit objektove promenne
  Set TFCll = Nothing
  Set SCll = Nothing
Err2:
  Set SBlk = Nothing
  Set SWsht = Nothing
  SWbk.Close True  ' zavrit datovy soubor
  Set SWbk = Nothing
Err1:
  Set TFBlk = Nothing
  Set TFWsht = Nothing
  Set TFWbk = Nothing
End Sub

