Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/39: Рейтинг темы: голосов - 39, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 01.09.2013
Сообщений: 66
1

Экспорт и последующий анализ данных spc

09.09.2013, 16:41. Показов 7350. Ответов 126
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
приветствую!

программист я не очень)) но имеется желание облегчить себе жизнь)
собственно суть:
имеем файл базы данных spc (лог системы контроля параметров) во вложении, данный фаил содержит примерно сутки работы системы количество строк всегда 10002 количество столбцов при преобразовании может варьироваться
необходимо:
1. наладить импорт из данного файла в таблицу Excel, ну или экспорт (с этим у меня пока самая большая проблема)
предполагаю что в конечной таблице должна открываться юзерформа где можно указать путь к файлу из которого нужно взять данные при этом копируемые данные должны помещаться в начало листа
2.после переноса в основной файл должны ракладываться в нормальные столбцы и проверятся на ряд параметров : Во первых должны удалятся строки содержащие хотя бы одно 0 значение, во вторых в конце массива могут содержаться дубли уже внесенной ранее информции т.к. лог снимается вручную втретих нужно проводить проверку на наполнение листа т.е при достижении 1кк строк начинать новый лист.
3. на отдельном листе или в юзерформе создать группу графиков с изменяемым интервалом дат т.е забиваем дата/время начало-дата/время конец и получаем графическое отображение изменений данных параметров.

собственно вопросы следующие:
насколько это реализуемо средствами excel/vba
как реализовать п 1.

п.2 сейчас потихоньку делаю сам, хотя как конролировать наполнение листа тоже пока не представляю.
Вложения
Тип файла: rar DataLogSPC.rar (165.3 Кб, 20 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.09.2013, 16:41
Ответы с готовыми решениями:

Обработка множества документов word/pdf и последующий семантический анализ их содержимого
Добрый день, уважаемые форумчане. Подскажите, каким образом корректней решать следующую задачу:...

Ввод данных в Input и их последующий вывод на странице
Добрый день. Только начал осваивать MVC. Осваиваю по оф документам и сайту metanit.com Под...

Поиск данных в текстовом файле и последующий вывод
Доброго времени суток, форумчане! Нужна ваша помощь. В колледже стал проходить C++ Builder, работаю...

SQL: Группирование записей таблицы, и последующий вывод данных
Доброго времени суток всем. Помогите с проблемкой. Есть таблица с платежами. Каждый студент может...

126
1261 / 147 / 32
Регистрация: 11.02.2011
Сообщений: 418
09.09.2013, 17:15 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

п1
Visual Basic
1
Workbooks.Open ("путь к файлу\DataLogSPC.csv")
Далее копируем что надо в рабочий лист или просто обрабатываем

Добавлено через 13 минут
И забыл.
Вот функция с примером использования, для того чтобы спросить юзверя где файл

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Function GetFilePath(Optional ByVal Title As String = "Выберите файл для обработки", _
                     Optional ByVal InitialPath As String = "C:\", _
                     Optional ByVal FilterDescription As String = "Книги Excel", _
                     Optional ByVal FilterExtention As String = "*.xls*") As String
    ' функция выводит диалоговое окно выбора файла с заголовком Title,
   ' начиная обзор диска с папки InitialPath
   ' возвращает полный путь к выбранному файлу, или пустую строку в случае отказа от выбора
   ' для фильтра можно указать описание и расширение выбираемых файлов
   On Error Resume Next
    With Application.FileDialog(msoFileDialogOpen)
        .ButtonName = "Выбрать": .Title = Title: .InitialFileName = InitialPath
        .Filters.Clear: .Filters.Add FilterDescription, FilterExtention
        If .Show <> -1 Then Exit Function
        GetFilePath = .SelectedItems(1): PS = Application.PathSeparator
    End With
End Function
 
' пример использования
 
Sub Test()
 
MyCSV = GetFilePath("Выберите файл csv", ThisWorkbook.Path, "Все файлы", "*.csv")
' Первый параметр - заголовок, второй путь по дефолту, третий тип файлов, четвёртый расширение
Workbooks.Open (MyCSV)
End Sub
1
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
09.09.2013, 17:42 3
Ну в общем после открытия файла используйте макрос:
Visual Basic
1
2
3
4
5
6
7
8
Sub SvcToXlsx()
    With ActiveSheet.Range("A1:A" & ActiveSheet.UsedRange.Rows.Count)
        .Replace What:=",", Replacement:=";", LookAt:=xlPart, SearchOrder:=xlByRows
        .Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder:=xlByRows
        .TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _
            TrailingMinusNumbers:=True
    End With
End Sub
и будет счастье...
1
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
09.09.2013, 17:54 4
Или так. Он попросит, а Вы укажите ему *.csv файл
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Sub ImportCSV_Files()
' The procedure for importing file *.CSV in Excel
    Dim mstr As String
    With Application.FileDialog(msoFileDialogFilePicker)
        .InitialFileName = Application.DefaultFilePath & "\"
        .Show
        If .SelectedItems.Count = 0 Then
            MsgBox "Canceled"
            Exit Sub
                Else
                    MsgBox .SelectedItems(1)
                    mstr = .SelectedItems(1)
        End If
        mstr = "TEXT;" & mstr
    End With
    [a1].Select
    With ActiveSheet.QueryTables.Add(Connection:= _
                  mstr, Destination:=ActiveCell)
        .TextFilePlatform = 1251  '
        .TextFileStartRow = 1 '  I did't define what this parameter
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False ' important parameter _
                                Background Query - Ôîí çàïèòó
    End With
    ActiveSheet.Name = "MyExport"
End Sub

Это по п.1.

Добавлено через 12 минут
А это я не понял:
Во первых должны удалятся строки содержащие хотя бы одно 0 значение
Пустых там ячеек много, а чтоб было значение 0 - ни одну не нашел.
1
0 / 0 / 0
Регистрация: 01.09.2013
Сообщений: 66
09.09.2013, 18:27  [ТС] 5
toiai, Спасибо, в принципе эту часть я макрорекордером записал и потом правил.
Пока вижу одну проблему если сначала переносить данные в конечный фаил то копирование идет не совсем верно первый цикл ОК а вот второй, столбец А смещается вниз при копировании но уже разложенные данные столбцы B,C и т.д остаются на месте

Цитата Сообщение от Igor_Tr Посмотреть сообщение
Пустых там ячеек много, а чтоб было значение 0 - ни одну не нашел.
В правы имелись ввиду пустые ячейки, пустая ячейка значит что комплекс в целом не работал, работали только отдельные узлы в ручном режиме, для статистики эти данные бесполезны.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
09.09.2013, 18:30 6
Если брать за основу мой код, тогда перед End Sub вставляете фразу Call mRemoveDublicate_DeleteEmpty.
После End Sub вставляете в модуль эту процедуру. Удалит дубликаты и строки, в которых хотя бы одна пустая ячейка (вот не нашел я с 0, хоть убейте )
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sub mRemoveDublicate_DeleteEmpty()
Dim mRng As Range, i&, j&, mARR()
   Application.ScreenUpdating = False
   With ActiveSheet
      ReDim mARR(0 To .UsedRange.Columns.Count - 1)
      For i = 1 To .UsedRange.Columns.Count:  mARR(i - 1) = i:  Next i
      Set mRng = .Range(.[a3], .Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count))
      mRng.RemoveDuplicates (mARR), xlNo
   End With
   With mRng
       For i = .Rows.Count To 1 Step -1
         If Application.CountA(.Rows(i)) < .Columns.Count Then
            .Rows(i).Delete
         End If
      Next 'i
   End With
   Application.ScreenUpdating = True
End Sub

Это же можно применить и к коду toiai. Если он не против.
2
0 / 0 / 0
Регистрация: 01.09.2013
Сообщений: 66
09.09.2013, 18:50  [ТС] 7
Цитата Сообщение от Igor_Tr Посмотреть сообщение
(вот не нашел я с 0, хоть убейте )
технически их там и не может быть узел либо работает и тогда есть значение параметра отличное от 0 или не работает тогда пустая ячейка. В коде toiai, принципиально важно это автозамены без них у Excel срывает крышу из-за . вместо ,
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
09.09.2013, 21:51 8
Лучший ответ Сообщение было отмечено как решение

Решение

По удалению строк с пустым значением в ячейке могу предложить вариант:
Visual Basic
1
2
3
4
5
6
7
8
9
Sub UdalEmpty()
    Dim x As Range
    On Error Resume Next
    With ActiveSheet
        For Each x In .Range(Cells(3, 2).Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)).SpecialCells(xlCellTypeBlanks)
            .Rows(x.Row).Delete
        Next
    End With
End Sub
Добавлено через 2 часа 52 минуты
И все-таки предлагаю более корректный способ удаления строк с пустой ячейкой(ами):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub UdalEmpty()
    Dim x As Range
    On Error Resume Next
    With ActiveSheet
        LastCol = .UsedRange.Columns.Count + 1
        For Each x In .Range(Cells(3, 1), Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)).SpecialCells(xlCellTypeBlanks)
            .Cells(x.Row, LastCol) = 1
        Next
        Set x = Cells(1, LastCol)
        .UsedRange.Columns(LastCol).ColumnDifferences(x).EntireRow.Delete
    End With
End Sub
3
6082 / 1326 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
09.09.2013, 21:54 9
Лучший ответ Сообщение было отмечено как решение

Решение

Здравствуйте,

Тогда и я предложу свой вариант удаления пустых строк .

Visual Basic
1
2
3
4
Sub UdalEmpty()
    On Error Resume Next
    ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub
Но вариант от toiai все равно лучший - он опубликован первым, а мой особо от него не отличается .

С уважением,
Aksima
3
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
09.09.2013, 22:05 10
Обожаю SpecialCells. А к EntireRow - все-таки с опаской....
0
0 / 0 / 0
Регистрация: 01.09.2013
Сообщений: 66
09.09.2013, 22:14  [ТС] 11
Спасибо всем за советы и подсказки

В общем пока вот что получилось, анализировать нужно файл из первого поста
пока проблемы с функцией удаления, я пока не понимаю ее логики
по факту:
вариант Igor_Tr и второй вариант toiai удаляет все
первый вариант toiai и вариант Aksima не удаляет ничего

p.s. то что сделано сборник , и часть кода проверялась методом научного тыка но пока так
Вложения
Тип файла: rar МК-1.rar (22.6 Кб, 5 просмотров)
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
09.09.2013, 22:23 12
Что значит: "...удаляет все..."? То что нужно, или вобще все? У меня выдаляет только нужное. И варианты toiai и Aksima должны так работать...
0
0 / 0 / 0
Регистрация: 01.09.2013
Сообщений: 66
09.09.2013, 22:28  [ТС] 13
Igor_Tr, верхние 2 строки остаются те которые шапка, а данные все сносятся, может я что-то не так делаю.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
09.09.2013, 22:28 14
Посмотрел Ваш вариант. Иииинтересная у Вас функция получилась с моего кода... Не изобретайте... А то не полетит. Если бы я, toiai, Aksima имели ввиду функции - так бы и написали. Думаю, все мы не гады... В душе, глубоко...
1
0 / 0 / 0
Регистрация: 01.09.2013
Сообщений: 66
09.09.2013, 23:00  [ТС] 15
Igor_Tr, кусочками отлаживать удобнее и смотреть как работает)) а это сильно влияет?

Добавлено через 10 минут
собрал все в кучку без функций все равно удаляется все

Добавлено через 8 минут
собрал только ваш код все равно все кроме шапки удаляется

Добавлено через 11 минут
а вот если к DataLogSPC.csv добавить макрос с кодом toiai, тогда все работает.
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
09.09.2013, 23:19 16
Проверил, все работает. Вот общий код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub SvcToXlsx()
    With ActiveSheet.Range("A1:A" & ActiveSheet.UsedRange.Rows.Count)
        .Replace What:=",", Replacement:=";", LookAt:=xlPart, SearchOrder:=xlByRows
        .Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder:=xlByRows
        .TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=True, Comma:=False, Space:=False, Other:=False, TrailingMinusNumbers:=True
    End With
    Dim x As Range
    On Error Resume Next
    With ActiveSheet
        LastCol = .UsedRange.Columns.Count + 1
        For Each x In .Range(Cells(3, 1), Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)).SpecialCells(xlCellTypeBlanks)
            .Cells(x.Row, LastCol) = 1
        Next
        Set x = Cells(1, LastCol)
        .UsedRange.Columns(LastCol).ColumnDifferences(x).EntireRow.Delete
    End With
End Sub
Кроме того, макрос может быть и в другом файле и запустить его можно через окно макросов открытого файла CVS, выбрав необходимый, т.е. вышеуказанный.
1
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
09.09.2013, 23:21 17
Нет, ну я гурман. Люблю кусочками - улитки, змеи, тараканы... Если уметь готовить... А код нужно ПОШАГОВО!!! Нажали F8 - посмотрели, нажали F8 - посмотрели....
Пробуйте, там чуть комбинировано - мое и toiai. Дальше сами комбинируйте, если нужно. А функции - очень хорошее дело, но иногда это как супер мини-юбка на похоронах.
Вложения
Тип файла: rar New_МК-1.rar (19.6 Кб, 4 просмотров)
1
0 / 0 / 0
Регистрация: 01.09.2013
Сообщений: 66
10.09.2013, 14:24  [ТС] 18
В общем как-то так получилось:

Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Sub DataTransfer()
Dim mstr As String, mFlag As Boolean, i&, j&
 
   Application.ScreenUpdating = False
   
   If  ActiveSheet.UsedRange.Rows.Count > 1048576 - 10002 Then
        Sheets.Add After:=Sheets(Sheets.Count)
            Else
            Rows("1:10002").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            End If
            
   With Application.FileDialog(msoFileDialogFilePicker)
      .InitialFileName = Application.DefaultFilePath & "\":  .Show
        If .SelectedItems.Count = 0 Then
            MsgBox "Canceled":   Exit Sub
                Else: mstr = .SelectedItems(1)
        End If
        mstr = "TEXT;" & mstr
   End With: [a1].Select
   With ActiveSheet.QueryTables.Add(Connection:= _
                                                      mstr, Destination:=ActiveCell)
        .TextFilePlatform = 1251:   .TextFileStartRow = 1
        .TextFileCommaDelimiter = False
        .TextFileColumnDataTypes = Array(1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
   End With
   With ActiveSheet.Range("A1:A10002")
        .Replace What:=",", Replacement:=";", LookAt:=xlPart, SearchOrder:=xlByRows
        .Replace What:=".", Replacement:=",", LookAt:=xlPart, SearchOrder:=xlByRows
        .TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
            TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
            Semicolon:=True, Comma:=False, Space:=False, Other:=False, TrailingMinusNumbers:=True
   End With
   j = 1
   For i = 2 To ActiveWorkbook.Sheets.Count
      If Sheets(i).Name = "MyExport_" & j Then j = j + 1
   Next 'i
    ActiveSheet.Name = "MyExport_" & j
    Call mRemoveDublicate_DeleteEmpty
    Application.ScreenUpdating = True
    Columns("A:AA").EntireColumn.AutoFit
    MsgBox Space(10) & "D O N E!"
End Sub
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub mRemoveDublicate_DeleteEmpty()
Dim mRng As Range, i&, j&, mARR()
   Application.ScreenUpdating = False
   With ActiveSheet
      ReDim mARR(0 To .UsedRange.Columns.Count - 1)
      For i = 1 To .UsedRange.Columns.Count:  mARR(i - 1) = i:  Next i
      Set mRng = .Range(.[a1], .Cells(20004, .UsedRange.Columns.Count))
      mRng.RemoveDuplicates (mARR), xlNo
   End With
 
   With mRng
       For i = .Rows.Count To 3 Step -1
         If Application.CountA(.Rows(i)) < .Columns.Count Then .Rows(i).Delete
      Next 'i
   End With:    Set mRng = Nothing
   Application.ScreenUpdating = True
End Sub


не разобрался как добавить автозамену в первый блок, а при проведении автозамены после разбиения по столбцам в некоторых столбцах данные отображаются некорректно.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
10.09.2013, 16:05 19
Если честно - то я не понял.
1.Вы проверяете кол-во строк раб. диапазона, и если их больше "явно заданое число" минус "явно заданое число" (1048576 - 10002 (почему сразу не написать 1038574)) и потом вставляете вверху 10002. Можна узнать, чем вызвано? И мне кажется, что при таком условии буде ошибка (нужных строк получится больше 1048576).
2. Вы "продублировали" работу - мой код и код toiai (пройдитеcь F8). Два раза одно и тоже, но другими словами.
3. С названием листа... Оно у Вас работает? Я там как-то по другому выражался... Но если работает (а я сомневаюсь) - пусть остается.
4. Что вы имели в виду, когда говорили "автозамена"? Если относительно кода toiai, то там все немного по другому. Когда Вашы даные в *.csv попадают на лист Excel, они все размещены только в ПЕРВОМ столбике. И вот код toiai его быстро приводят к нужному, а потом раскидывают по столбцам, ориентируясь по запятым.
0
0 / 0 / 0
Регистрация: 01.09.2013
Сообщений: 66
10.09.2013, 16:26  [ТС] 20
Igor_Tr,
2. не совсем продублировал, Ваш код сейчас переносит из файла *.csv фактически один столбец, потом начинает работать код toiai, проводит замены "," на ";" и "." на "," (без этой автозамены разложенные на столбцы значения некорректно читаются) и раскладывает на столбцы по ";".
1. Когда Ваш код отрабатывает он фактически смещает вниз только столбец А остальные данные остаются справа и при разложении их смещает вправо а не вниз для того чтобы этого не происходило добавляем 10002 строк (размер *.csv всегда такой) смещая ранее загруженный диапазон. насчет почему не 1038574, не сообразил. в любом случае если в документе 1038574 строки то еще 10002 влезет если не влезет создаем новый лист.
3.с названием листа не работает) пока не было первого пустого листа вроде работало а теперь все равно второй лист называет *_2 после второго цикла загрузки данных, как назовет третий пока не проверял.
4. в *.csv числовые значения разделены точкой из-за чего после разложения на столбцы читаются некорректно, особенно те столбцы где значение подходит под формат даты.
0
10.09.2013, 16:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.09.2013, 16:26
Помогаю со студенческими работами здесь

Чтение из файла данных и последующий вывод на экран в виде линейного однонаправленного списка
Здравствуйте, я новичок в программировании. Не понимаю как выполнить следующую задачу: Дан список...

Копирование строки. При вводе пробела программа пропускает последующий ввод данных
char st, st1; int k, m, i, j; system(&quot;cls&quot;); cout &lt;&lt;&quot;Введите строку&quot;&lt;&lt;endl; cin &gt;&gt;st; ...

Экспорт данных из базы данных *.DB в Word через Table (DateSet)
Всем Hello! у меня проблема не могу выгрузить данные из DB через table много чего перепробовал но...

Как сделать экспорт данных из таблицы базы данных MSSQL 2008 в Excel на php?
Добрый день. Подскажите как сделать экспорт данных из таблицы базы данных MSSQL 2008 в Excel ?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru