На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Организуем VBA-FAQ! Если у Вас есть предложения, выскажитесь здесь: Пишем FAQ, интересно Ваше мнение
Популярные разделы FAQ:    user posted image Общие вопросы    user posted image Особенности VBA-кода    user posted image Оптимизация VBA-кода    user posted image Полезные ссылки

1. Старайтесь при создании темы указывать в заголовке или теле сообщения название офисного приложения и (желательно при работе с Office 95/97/2000) его версию. Это значительно сократит количество промежуточных вопросов.
2. Формулируйте вопросы как можно конкретнее, вспоминая (хотя бы иногда) о правилах ВЕЛИКОГО И МОГУЧЕГО РУССКОГО ЯЗЫКА, и не забывая, что краткость - сестра таланта.
3. Не забывайте использовать теги [сode=vba] ...текст программы... [/code] для выделения текста программы подсветкой!
4. Темы с просьбой выполнить какую-либо работу полностью за автора здесь не обсуждаются и переносятся в раздел ПОМОЩЬ СТУДЕНТАМ.
Модераторы: Old Bat, MIF
  
> "Вычесть" один файл из другого
    Приветствую!

    Возникла периодически повторяющаяся задача. Пока решал "кустарными" методами. Если не лениво, покажите как такое можно решить на VBA, уверен - кода много не будет.

    Суть

    Есть файлы 1.xls и 2.xls. Нужно в первом файле оставить только те строки, которых нет во втором файле. Однако, речь идет не о сравнении всей строки, а только, скажем так, "ключевой" ячейки. Пример:

    1.xls
    UIN;ФИО;
    DF559849495;Иванов Иван Иванович;

    2.xls
    UNN;ФИО;UIN;
    23333477757;Иванов Иван Иванович;DF559849495;

    Как видно - в первом файле "ключевой" столбец первый, а во втором файле - третий.

    А решал пока так

    Выгружал данные файлов в csv-формате. Запускал скрипт, который написал на Перле, результат загружал в новый файл. Естественно, хотелось бы избавиться от ручных манипуляций.

    ExpandedWrap disabled
      #!/usr/local/bin/perl
       
      use FileHandle;
       
      $file = FileHandle->new;
      die "Read error in file!" unless ($file->open("< 1.csv"));
      @One = <$file>;
      $file->close;
      die "Read error out file!" unless ($file->open("< 2017.csv"));
      @Res = <$file>;
      $file->close;
       
      foreach $I (@One) {
        @Tmp = split(/;/,$I);
        $Tmp[0] =~ s/(\S+).*/$1/;  # 0 - номер столбца с "ключевыми" данными IN
        $ResHash{$Tmp[0]} = 1;
      }
       
      foreach $I (@Res) {
        @Tmp = split(/;/,$I);
        $Tmp[2] =~ s/(\S+).*/$1/;  # 2 - номер столбца с "ключевыми" данными OUT
        print $I unless exists $ResHash{$Tmp[0]};
      }
      Тупо циклики for. :D

      Я вижу это вот так примерно.
      Работа с массивами заметно быстрее, особенно при больших объёмах данных.
      Естесно я это не тестировал, но должно работать.
      Интерфейса нет, все параметры задаются в коде, если это пойдёт конечно надо будет допилить.
      Прикреплённый файлПрикреплённый файл__________1.rar (10,89 Кбайт, скачиваний: 48)
      Сообщение отредактировано: SV() -
        Пасип! Вечерком поразбираюсь.
          Цитата JoeUser @
          Пасип! Вечерком поразбираюсь.

          Я там пару грамматических ошибок сделал :blush:
          щас прикрепил исправленный файлик
            Да сделай это макросом... вот какой-нить дурью типа

            ExpandedWrap disabled
              Sub DeleteRows()
              Dim wbk2 As Workbook
              Dim sht1 As Worksheet
              Dim sht2 As Worksheet
              Dim rng2 As Range
              Dim i As Long
               
              Set wbk2 = Workbooks.Open("c:\Книга2.xls")
              Set sht1 = ThisWorkbook.Sheets("Лист1")
              Set sht2 = wbk2.Sheets("Лист1")
              Set rng2 = sht2.Range("A:A").SpecialCells(xlCellTypeLastCell)
              For i = rng2.Row To 1 Step -1
                  If Not sht1.Range("A:A").Find(sht2.Cells(i, 1), LookIn:=xlValues) Is Nothing Then
                      sht1.Range("A:A").Find(sht2.Cells(i, 1), LookIn:=xlValues).Rows.EntireRow.Delete
                  End If
              Next i
              End Sub
              Akina, пасип!
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0331 ]   [ 17 queries used ]   [ Generated: 23.04.24, 17:21 GMT ]