<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBA: Две книги с данными, перенести нужные из 2-ух в 3-ю]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=17989</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=17989&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBA: Две книги с данными, перенести нужные из 2-ух в 3-ю».]]></description>
		<lastBuildDate>Wed, 08 Nov 2023 08:42:34 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBA: Две книги с данными, перенести нужные из 2-ух в 3-ю]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159458#p159458</link>
			<description><![CDATA[<p><strong>GFeniks</strong>, добрый день.</p><p>Вот, что-то вроде работающее:<br /></p><div class="codebox"><pre><code>Sub cbMakeIskluchSpsok_Click()
 
    &#039; ошибки обрабатываем сами.
    On Error Resume Next
    
    &#039;Переменные для хранения имен файлов старого и нового списков
    Dim old_sp_book As String
    Dim new_sp_book As String
    Dim iskl_sp_book As String
    &#039;Переменная для хранения имени файла списка исключенных
    Dim old_spisok As Workbook
    Dim new_spisok As Workbook
    Dim iskl_spisok As Workbook
    &#039;Рабочие листы в файлах (все первые)
    Dim old_sheet As Worksheet
    Dim new_sheet As Worksheet
    Dim iskl_sheet As Worksheet
    
    &#039;Устанавливаем активным каталог книги, из которой запущен макрос
    ChDir ThisWorkbook.Path
    
    &#039;Признак ошибки
    Dim bError As Boolean
    
    &#039;Открываем файл старого списка
    Set old_spisok = Open_Xls(&quot;old_sp&quot;)
    &#039;Открываем файл нового списка
    Set new_spisok = Open_Xls(&quot;new_sp&quot;)
    
    bError = (old_spisok Is Nothing) Or (new_spisok Is Nothing)
    
    If Not bError Then
        
        iskl_sp_book = ThisWorkbook.Path &amp; &quot;\&quot; &amp; &quot;Iskl_spisok_Added &quot; &amp; CStr(Date) &amp; &quot;.xls&quot;
        &#039;Создаем ексель-книгу для списка исключенных
        Set iskl_spisok = Workbooks.Add
        &#039;Сохраняем созданную эксель-книгу со списка исключенных
        iskl_spisok.SaveAs Filename:=iskl_sp_book, FileFormat:=xlExcel8, _
            Password:=&quot;&quot;, WriteResPassword:=&quot;&quot;, ReadOnlyRecommended:=False, _
            CreateBackup:=False
        
        Set old_sheet = old_spisok.Sheets(1)
        Set new_sheet = new_spisok.Sheets(1)
        Set iskl_sheet = iskl_spisok.Sheets(1)
        
        &#039;Последняя строка с данными
        Dim new_sheet_end_row As Long, CurrNumericRow As Long
        new_sheet_end_row = new_sheet.Cells.SpecialCells(xlLastCell).Row
        
        &#039;Переменная-счетчик для перебора строк нового списка
        Dim i_new As Long, i_iskl As Long
        
        For i_new = 1 To new_sheet_end_row
            CurrNumericRow = Val(new_sheet.Cells(i_new, 1).Value)
            If CurrNumericRow &gt; 0 Then
                &#039; текущая строка в исключениях
                i_iskl = i_iskl + 1
                old_sheet.Rows(CurrNumericRow).Copy iskl_sheet.Rows(i_iskl)
            Else
                &#039;ничего не делать :)))
            End If
        Next i_new
            
    End If &#039;Not bError
    
    &#039;Закрываем файлы
    Close_Xls iskl_spisok, True &#039;сохранить изменения
    Close_Xls old_spisok, False &#039;не сохранять изменения
    Close_Xls new_spisok, False &#039;не сохранять изменения
 
    Set old_spisok = Nothing
    Set new_spisok = Nothing
    Set iskl_spisok = Nothing
 
End Sub

&#039; Открывает рабочую книгу с перебором расширений.
&#039; Возвращает объект Workbook или Nothing в случае ошибки.
Function Open_Xls(ByVal sFileName As String) As Workbook
    Dim sExt, sFile As String
    Set Open_Xls = Nothing
    
    For Each sExt In Array(&quot;.xls&quot;, &quot;.xlsx&quot;)
        sFile = ActiveWorkbook.Path + &quot;\&quot; + sFileName + sExt
        If Dir(sFile) &lt;&gt; &quot;&quot; Then
            Set Open_Xls = Workbooks.Open(sFile)
            Exit For
        End If
    Next sExt

    If Open_Xls Is Nothing Then
        MsgBox &quot;Ошибка открытия: &quot; &amp; sFileName
    End If

End Function

&#039; Закрывает рабочую книгу.
Sub Close_Xls(ByVal oWorkbook As Workbook, Optional ByVal bSaveChanges As Boolean)
    If Not oWorkbook Is Nothing Then
        oWorkbook.Close bSaveChanges &#039;True = сохранять изменения
    End If
End Sub
</code></pre></div><p>Пояснения:<br /></p><ul><li><p>Application.CutCopyMode - нет смысла устанавливать. Также, как и пользоваться Activate/Select/Copy/Paste. </p></li><li><p>Перебор расширений (&quot;.xls&quot;, &quot;.xlsx&quot;) я спрятал в функцию: Open_Xls.</p></li><li><p>В основном цикле (For i_new = 1 To new_sheet_end_row) перебираются все строки листа new_sheet и в случае ненулевого значения в первом столбце строка с таким номером (CurrNumericRow) копируется из old_sheet в iskl_sheet (в очередную строку i_iskl).</p></li><li><p>Выражение sheet.Rows(N) обращается к строке N целиком (можно не выделять часть строки с помощью громоздкого Range).</p></li><li><p>Количество строк для цикла - это номер строки последней заполненной ячейки листа new_sheet: Cells.SpecialCells(xlLastCell). На данную ячейку мы попадаем по нажатию Ctrl-End.</p></li></ul>]]></description>
			<author><![CDATA[null@example.com (andypetr)]]></author>
			<pubDate>Wed, 08 Nov 2023 08:42:34 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159458#p159458</guid>
		</item>
		<item>
			<title><![CDATA[VBA: Две книги с данными, перенести нужные из 2-ух в 3-ю]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=159447#p159447</link>
			<description><![CDATA[<p>Добрый день.<br />Использую MS Excel 2010.<br />Сразу говорю: программист я начинающий.<br />Есть книга, из которой запускается макрос VBA, она открывает файл &quot;old_sp.xls&quot; (таблица со старыми данными граждан: Фамилия, Имя и тд., заголовков таблицы нет, идут сразу строки с данными) и файл &quot;new_sp.xls&quot; (с новыми данными граждан: Номер гражданина в выборке, Фамилия, Имя и тд., заголовки таблицы есть), также макрос создает новую книгу. В файле &quot;new_sp.xls&quot; строки с данными идут не подряд, а имеются пустые строки. Нужно найти в файле &quot;new_sp.xls&quot; непустую строку, проверить, что в ее первой ячейке слева стоит именно чиcло (это номер гражданина в выборке, колонка называется &quot;№, п/п&quot;), запомнить этот номер в переменной, и в старом списке, &quot;old_sp.xls&quot;, отсчитать сверху количество строк, равное числу в сохранённой переменной, если эта строка не пуста, то скопировать всю строку с данными по текущему гражданину в созданный xls-файл.&nbsp; И так нужно перебрать все строки в файле &quot;new_sp.xls&quot;. Затем когда вновь созданная книга (список исключённых граждан) будет заполнена, строками из &quot;old_sp.xls&quot;, сохранить ее на жёсткий диск.</p><p>Я пошёл через циклы While Do...Loop. Пока у меня обрабатывается только первая непустая строка, с номером, из нового списка. Как сделать, чтобы обрабатывались все строки из нового списка и соответствующие им строки из старого списка копировались в список исключенных?</p><p>Код:</p><div class="codebox"><pre><code>Sub cbMakeIskluchSpsok_Click()
 
    &#039;Переменные для хранения имен файлов старого и нового списков
    Dim old_sp_book As String
    Dim new_sp_book As String
    &#039;Переменная для хранения имени файла списка исключенных
    Dim old_spisok As Workbook
    Dim new_spisok As Workbook
    Dim iskl_spisok As Workbook
    
    &#039;Устанавливаем активным каталог книги, из которой запущен макрос
    ChDir (ThisWorkbook.Path)
    &#039;Устанавливаем режим копирования-вставки
    Application.CutCopyMode = True
    
    &#039;Открываем файл старого списка
    If Dir(ActiveWorkbook.Path + &quot;\&quot; + &quot;old_sp.xls&quot;) = &quot;&quot; Then
    
        Workbooks.Open ActiveWorkbook.Path + &quot;\&quot; + &quot;old_sp.xlsx&quot;
        Set old_spisok = Workbooks.Open(ThisWorkbook.Path + &quot;\&quot; + &quot;old_sp.xlsx&quot;)
    
    Else
    
        Workbooks.Open ActiveWorkbook.Path + &quot;\&quot; + &quot;old_sp.xls&quot;
        Set old_spisok = Workbooks.Open(ThisWorkbook.Path + &quot;\&quot; + &quot;old_sp.xls&quot;)
 
    End If
 
    &#039;Открываем файл нового списка
    If Dir(ThisWorkbook.Path + &quot;\&quot; + &quot;new_sp.xls&quot;) = &quot;&quot; Then
    
        Workbooks.Open ActiveWorkbook.Path + &quot;\&quot; + &quot;new_sp.xlsx&quot;
        Set new_spisok = Workbooks.Open(ThisWorkbook.Path + &quot;\&quot; + &quot;new_sp.xlsx&quot;)
    
    Else
    
        Workbooks.Open ActiveWorkbook.Path + &quot;\&quot; + &quot;new_sp.xls&quot;
        Set new_spisok = Workbooks.Open(ThisWorkbook.Path + &quot;\&quot; + &quot;new_sp.xls&quot;)
    
    End If
 
    &#039;Создаем ексель-книгу для списка исключенных
    Set iskl_spisok = Workbooks.Add
    
    &#039;Сохраняем и закрываем созданную эксель-книгу со списка исключенных
    iskl_spisok.SaveAs Filename:=ThisWorkbook.Path &amp; &quot;\&quot; &amp; &quot;Iskl_spisok_Added &quot; &amp; CStr(Date) &amp; &quot;.xls&quot;, 

FileFormat:=xlExcel8, _
        Password:=&quot;&quot;, WriteResPassword:=&quot;&quot;, ReadOnlyRecommended:=False, _
        CreateBackup:=False
    
   
    &#039;Переменные-счестчики для перебра строк нового старого списка, старого списка и списка сиключенных
    &#039;Переменная-счетчик для перебора строк нового списка
    Dim i As Long
    &#039;Переменная-счетчик для перебора строк старого списка
    &#039;Dim j As Long
    &#039;Переменная-счетчик для перебора строк списка исключенных
    Dim k As Long
    &#039;Переменная для хранения номера непстой строки в новом списке
    Dim CurrNumericRow As Long
    &#039;Метка для продолжения цикла с перебором строк в новом списке
    Dim Metka As Label
    
    &#039;&#039;&#039;Действия по формированию списка исключенных граждан
    &#039;Активация файла нового списка
    i = 1
    k = 1
    
Metka:
    
    new_spisok.Activate
    
    ActiveWorkbook.Sheets(1).Activate
    
    Do While i &lt;&gt; 65535
    
    
        If ActiveSheet.Range(Cells(i, 1).Address).Text &lt;&gt; &quot;&quot; And IsNumeric(ActiveSheet.Range(Cells(i, 

1).Address).Text) = True Then
        
                        CurrNumericRow = CLng(ActiveSheet.Range(Cells(i, 1).Address).Text)
                        
                        old_spisok.Activate
                        
                        ActiveWorkbook.Sheets(1).Activate
            
                        ActiveSheet.Range(Cells(CurrNumericRow, 1).Address &amp; &quot;:&quot; &amp; Cells(CurrNumericRow, 

11).Address).Select
                                
                        Selection.Copy
                        
                       &#039;Вставка ранее скопированного дисапозона ячеек в список исключенных граждан
                        iskl_spisok.Activate
                            
                        ActiveWorkbook.Sheets(1).Activate
                        
                       
                        Do While k &lt;&gt; 65535
                        
                            If ActiveSheet.Range(Cells(k, 1).Address).Text = &quot;&quot; Then
                                
                                ActiveSheet.Range(Cells(k, 1).Address).Select
                                
                                ActiveSheet.Paste
                                
                                Exit Do
                            
                            Else
                                    
                                k = k + 1
                            
                            End If
        
        
                        Loop

            Else
                        
                    &#039;ничего не делать :)))
                    
            End If
            
           i = i + 1
            
     Loop
        
    &#039;Сохранение сформированного файла-списка исключенных
    &#039;iskl_sp_book.SaveAs &quot;????_?_?????\??????_???????????.xls&quot;
 
End Sub</code></pre></div><p>Прикрепляю архив примера (данные левые, нужен чисто принцип), плиз хелп <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (GFeniks)]]></author>
			<pubDate>Tue, 07 Nov 2023 05:18:12 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=159447#p159447</guid>
		</item>
	</channel>
</rss>
