Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2012, 12:36   #1
CHIPATAM
Новичок
Джуниор
 
Регистрация: 31.10.2012
Сообщений: 2
По умолчанию Перенести данные из одной книги в другую

Всем доброго времени суток. Стоит следующая задача, нужно провести проверку по столбцу, если значения в них будут больше 0, то вся эта строка должна копироваться в другую книгу. Помогите пожалуйста с макросом
CHIPATAM вне форума Ответить с цитированием
Старый 01.11.2012, 13:20   #2
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

для работы примера, второй фаил должен быть открыт!

Код:
Sub ПереносВидимыхСтрок()
    Dim i As Long
    Application.ScreenUpdating = False
    On Error Resume Next
        With ThisWorkbook.ActiveSheet
            i = .Cells(Rows.Count, 1).End(xlUp).Row
            If .AutoFilter.Filters(1).On Then
                .Range("A1:A" & i).AutoFilter Field:=1, Criteria1:="<>"
                .Range("A1:A" & i).SpecialCells(xlCellTypeVisible).EntireRow.Copy Workbooks("Книга 2.xlsx").Sheets("Лист1").Range("A1")
                .Range("A1:A" & i).AutoFilter = False
            Else
                .Range("A1:A" & i).AutoFilter Field:=1, Criteria1:="<>"
                .Range("A1:A" & i).SpecialCells(xlCellTypeVisible).EntireRow.Copy Workbooks("Книга 2.xlsx").Sheets("Лист1").Range("A1")
                .Range("A1:A" & i).AutoFilter Field:=1
            End If
        End With
    Application.ScreenUpdating = True
End Sub
Вложения
Тип файла: rar пример.rar (19.8 Кб, 31 просмотров)
Единственный способ стать умнее, играть с более умным противником...

Последний раз редактировалось staniiislav; 01.11.2012 в 14:29.
staniiislav вне форума Ответить с цитированием
Старый 01.11.2012, 14:15   #3
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

можно еще так:

Код:
Sub пример2()
Dim x, i As Long, n As Long
x = Range("A1").CurrentRegion.Value
For i = 1 To UBound(x, 1)
    If Not IsEmpty(x(i, 1)) Then
        n = n + 1
        x(n, 1) = x(i, 1): x(n, 2) = x(i, 2): x(n, 3) = x(i, 3)
    End If
Next i
Workbooks("Книга 2.xlsx").Sheets("Лист1").Range("A1").Resize(n, 3).Value = x
End Sub
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 01.11.2012, 14:24   #4
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

еще один вариант:

Код:
Sub пример3()
Dim x, i&, t()

With CreateObject("Scripting.Dictionary")
    .CompareMode = 1
        x = Range("A1").CurrentRegion.Value
        For i = 1 To UBound(x)
            If Not IsEmpty(x(i, 1)) Then
                If Not .Exists(x(i, 1)) Then
                    .Item(x(i, 1)) = Array(x(i, 1), x(i, 2), x(i, 3))
                End If
            End If
        Next
        
    x = Application.Transpose(Application.Transpose(.Items))
    Workbooks("Книга 2.xlsx").Sheets("Лист1").Range("A1").Resize(UBound(x), 3).Value = x
End With

End Sub
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 01.11.2012, 14:41   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Второй вариант хороший - используется исходный массив, экономия памяти.

Последний вариант интересный, я такого не видел
Но там не совсем соблюдаются исходные условия:
1 нет проверки на >0
2 копируются данные только первого встреченного уникального значения первого столбца, т.е. повторы будут игнорироваться.
Ну и напрягает двойное Transpose - на больших объёмах как-то неоптимально, да и вообще на больших может не сработать.
Тогда уж быстрее и надёжнее просто в цикле переложить данные в двумерный массив.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 01.11.2012, 15:35   #6
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Такой вариант должен чуть быстрее работать:
Код:
Sub Макрос1()
  НомерСтолбцаПроверки = 1
  Application.ScreenUpdating = False
  Set R = [A1].Resize(Range("A" & Rows.Count).End(xlUp).Row, Cells(1, Columns.Count).End(xlToLeft).Column)
  [1:3].Insert Shift:=xlDown
  [4:4].Copy [A1]
  Cells(2, НомерСтолбцаПроверки) = ">0"
  R.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Intersect([1:2], R.EntireColumn), CopyToRange:=Range("Лист2!A1")
  [1:3].Delete Shift:=xlUp
  Application.ScreenUpdating = True
End Sub
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 01.11.2012 в 15:39.
DiemonStar вне форума Ответить с цитированием
Старый 01.11.2012, 15:50   #7
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Второй вариант хороший - используется исходный массив, экономия памяти.

Последний вариант интересный, я такого не видел
Но там не совсем соблюдаются исходные условия:
1 нет проверки на >0
2 копируются данные только первого встреченного уникального значения первого столбца, т.е. повторы будут игнорироваться.
Ну и напрягает двойное Transpose - на больших объёмах как-то неоптимально, да и вообще на больших может не сработать.
Тогда уж быстрее и надёжнее просто в цикле переложить данные в двумерный массив.
спасибо за пояснение, да немного перемудрил, кто-то на форуме делал что-то подомное, воя примерчик и сохранил, к сожалению нет манеры подписывать когда и кто делал пример (((

в таком случаи получится тоже самое что и второй вариант, только в прифи )))

я правильно Вас понял?:

Код:
Sub пример3()
Dim x, i&, j&, n As Long

'With CreateObject("Scripting.Dictionary")
'    .CompareMode = 1
        x = Range("A1").CurrentRegion.Value
        For i = 1 To UBound(x, 1)
            If Not IsEmpty(x(i, 1)) Then
            n = n + 1
                For j = 1 To UBound(x, 2)
                    x(n, j) = x(i, j)
                'If Not .Exists(x(i, 1)) Then
                '    .Item(x(i, 1)) = Array(x(i, 1), x(i, 2), x(i, 3))
                'End If
                Next j
            End If
        Next i
        
    'x = Application.Transpose(Application.Transpose(.Items))
    Workbooks("Книга 2.xlsx").Sheets("Лист1").Range("A1").Resize(n, 3).Value = x
'End With

End Sub
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 01.11.2012, 16:12   #8
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
Такой вариант должен чуть быстрее работать:
Код:
Sub Макрос1()
  НомерСтолбцаПроверки = 1
  Application.ScreenUpdating = False
  Set R = [A1].Resize(Range("A" & Rows.Count).End(xlUp).Row, Cells(1, Columns.Count).End(xlToLeft).Column)
  [1:3].Insert Shift:=xlDown
  [4:4].Copy [A1]
  Cells(2, НомерСтолбцаПроверки) = ">0"
  R.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Intersect([1:2], R.EntireColumn), CopyToRange:=Range("Лист2!A1")
  [1:3].Delete Shift:=xlUp
  Application.ScreenUpdating = True
End Sub
я так понял копируется не вся строка, а только 1 столбец?
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 01.11.2012, 16:58   #9
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
я так понял копируется не вся строка, а только 1 столбец?
а что мешает попробовать и посмотреть на результат?
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 01.11.2012, 17:27   #10
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
а что мешает попробовать и посмотреть на результат?
попробовал, потому и спросил
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MS SQL SERVER 2005 копирование таблицы из ОДНОЙ БД В другую или перенести все строки из одной таблицы в другую reihtmonbern БД в Delphi 4 17.07.2012 23:25
перенести данные с одной таблицы в другую Natashka Milashka SQL, базы данных 4 05.06.2012 14:02
Как получить данные из одной открытой книги в другую? gramp Microsoft Office Excel 14 25.07.2011 10:02
Перенести запись из одной таблицы dbf в другую FleshDro SQL, базы данных 7 06.08.2009 13:00
Как с помощью SQL перенести данные из одной таблицы в другую lenuxoid БД в Delphi 1 23.04.2009 20:45