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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2016, 13:02   #1
Bridges Specialist
Новичок
Джуниор
 
Регистрация: 19.03.2016
Сообщений: 5
Восклицание Работа с файлом через макросы

День добрый, уважаемые форумчане!

Суть вопроса такова, имеется .txt файл, его нужно открыть в exel указав путь к нему. Далее его необходимо отредактировать так, чтобы все текстовые и пустые строки были удалены. А данные из столбца в который все вставилось расформировались в отдельные. Так же необходимо чтобы строки с одинаковыми значениями в стоблцах B,C,D были удалены(одна из двух осталась). Пример прикреплен в архиве: txt файл - исходный; на листе 1 в exel показано, что происходит при вставке, на листе 2, то что необходимо получить.

Спасибо!

P.S.: пытался найти данные макросы по отдельности чтобы слиять их в один, но безуспешно.
Вложения
Тип файла: rar Пример.rar (8.8 Кб, 11 просмотров)
Bridges Specialist вне форума Ответить с цитированием
Старый 19.03.2016, 13:26   #2
Bridges Specialist
Новичок
Джуниор
 
Регистрация: 19.03.2016
Сообщений: 5
По умолчанию Дополнение

Причем кол-во строк может быть больше, чем в приложенном примере
Bridges Specialist вне форума Ответить с цитированием
Старый 19.03.2016, 13:27   #3
mchip
Форумчанин
 
Регистрация: 24.06.2008
Сообщений: 516
По умолчанию

Самое простое - записать макрос. Нажать на кнопочку записи макроса - выполнить действия - и посмотреть макрос.
Вот что у меня получилось:
Код:
Sub Макрос1()
'
' Макрос1 Макрос
'

'
    Range("F3").Select
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;D:\Users\Maxim\Downloads\1.txt", Destination:=Range("$H$4"))
        .CommandType = 0
        .Name = "1_1"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1252
        .TextFileStartRow = 7
        .TextFileParseType = xlFixedWidth
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1)
        .TextFileFixedColumnWidths = Array(7, 11, 10)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
    End With
End Sub
Можно сделать все! Было бы время, да деньги...
mchip вне форума Ответить с цитированием
Старый 19.03.2016, 13:28   #4
mchip
Форумчанин
 
Регистрация: 24.06.2008
Сообщений: 516
По умолчанию

И ему без разницы сколько строк в файле!
Можно сделать все! Было бы время, да деньги...
mchip вне форума Ответить с цитированием
Старый 19.03.2016, 14:12   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

положите в программный модуль, выполните этот
Код:
Sub TxtRasKolbas()
  Dim fn, rg As Range, rgD As Range
  fn = Application.GetOpenFilename("Txt files, *.txt", 1, "Укажите файл", MultiSelect:=False)
  If fn = False Then Exit Sub
  Workbooks.Open (fn)
  ActiveSheet.UsedRange.Offset(, 1).FormulaR1C1 = "=trim(rc1)"
  ActiveSheet.UsedRange.Copy: Cells(1, 1).PasteSpecial Paste:=xlPasteValues
  Columns(2).TextToColumns Cells(1, 2), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
    Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
  For Each rg In Intersect(ActiveSheet.UsedRange, Columns(2)).Cells
    If IsEmpty(rg) Or (Not IsNumeric(rg)) Then If rgD Is Nothing Then Set rgD = rg Else Set rgD = Union(rgD, rg)
  Next
  Columns(1).Delete:  If Not rgD Is Nothing Then rgD.EntireRow.Delete
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 19.03.2016, 15:27   #6
Bridges Specialist
Новичок
Джуниор
 
Регистрация: 19.03.2016
Сообщений: 5
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
положите в программный модуль, выполните этот
Код:
Sub TxtRasKolbas()
  Dim fn, rg As Range, rgD As Range
  fn = Application.GetOpenFilename("Txt files, *.txt", 1, "Укажите файл", MultiSelect:=False)
  If fn = False Then Exit Sub
  Workbooks.Open (fn)
  ActiveSheet.UsedRange.Offset(, 1).FormulaR1C1 = "=trim(rc1)"
  ActiveSheet.UsedRange.Copy: Cells(1, 1).PasteSpecial Paste:=xlPasteValues
  Columns(2).TextToColumns Cells(1, 2), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
    Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
  For Each rg In Intersect(ActiveSheet.UsedRange, Columns(2)).Cells
    If IsEmpty(rg) Or (Not IsNumeric(rg)) Then If rgD Is Nothing Then Set rgD = rg Else Set rgD = Union(rgD, rg)
  Next
  Columns(1).Delete:  If Not rgD Is Nothing Then rgD.EntireRow.Delete
End Sub
Спасибо большое, и ещё вопрос, как удалить абсолютно все строки в которых совпадает 3 столбец?
Bridges Specialist вне форума Ответить с цитированием
Старый 19.03.2016, 15:34   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

А почему в примере не удалены "абсолютно все строки в которых совпадает 3 столбец?"
Или нужно то, что делает стандартное "удалить дубликаты"?
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 19.03.2016, 15:51   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

в начале:
Цитата:
необходимо чтобы строки с одинаковыми значениями в стоблцах B,C,D были удалены(одна из двух осталась)
потом:
Цитата:
как удалить абсолютно все строки в которых совпадает 3 столбец?
я благополучно пропустил, что нужно было удалить дубли
а теперь вопрос:
что же реально удалять?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 19.03.2016, 16:29   #9
Bridges Specialist
Новичок
Джуниор
 
Регистрация: 19.03.2016
Сообщений: 5
По умолчанию

Да, согласен, неясно выяснился и возможно в примере не сделал данную вещь. Чтобы было яснее:
В третьем столбце С-указано расстояние. нужно чтобы все строки в которых одно и тоже значение расстояния (столбец C) были так же удалены.
Bridges Specialist вне форума Ответить с цитированием
Старый 19.03.2016, 17:25   #10
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Sub TxtRasKolbas()
  Dim fn, rg As Range, rgD As Range, r As Long
  fn = Application.GetOpenFilename("Txt files, *.txt", 1, "Укажите файл", MultiSelect:=False)
  If fn = False Then Exit Sub
  Workbooks.Open (fn)
  ActiveSheet.UsedRange.Offset(, 1).FormulaR1C1 = "=trim(rc1)"
  ActiveSheet.UsedRange.Copy: Cells(1, 1).PasteSpecial Paste:=xlPasteValues
  Columns(2).TextToColumns Cells(1, 2), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=True, Tab:=True, _
    Semicolon:=False, Comma:=False, Space:=True, Other:=False, FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True
  For Each rg In Intersect(ActiveSheet.UsedRange, Columns(2)).Cells
    If IsEmpty(rg) Or (Not IsNumeric(rg)) Then If rgD Is Nothing Then Set rgD = rg Else Set rgD = Union(rgD, rg)
  Next
  Columns(1).Delete:  If Not rgD Is Nothing Then rgD.EntireRow.Delete: r = 1
  Do While Not IsEmpty(Cells(r, 3))
    If WorksheetFunction.CountIf(Columns(3), Cells(r, 3)) > 1 Then Rows(r).Delete Else r = r + 1
  Loop
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка письма с прикрепленным файлом на SMTP через Winsock+OpenSSL Visual Studio C++ 2010 Binary_Dll C/C++ Сетевое программирование 11 28.04.2015 19:12
Помогите, как написать программу через макросы 5Настёна Помощь студентам 2 04.12.2013 18:31
Активные макросы через DSOFramer m9yt Microsoft Office Excel 12 12.10.2013 07:38
работа с файлом AET Общие вопросы Delphi 7 30.06.2011 23:38
Работа с файлом orkus Общие вопросы Delphi 4 02.04.2010 04:51