Сохранение листов в файлы csv

Программирование на Visual Basic for Applications
madfrog
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 22.11.2004 (Пн) 15:39

Сохранение листов в файлы csv

Сообщение madfrog » 22.11.2004 (Пн) 15:49

В процессе написания одного из проектов столкнулся с неприятной вещью, у клиента нет 1С и все выгрузки из самописной бухгалтерии они делают в Excel. Для работы же нашего ПО требуется формат csv, либо подобный.

В связи с этим просьба к уважаемым участникам форума, не поможет ли кто написать скрипт (жел. с коментариями) ибо сдача проекта на днях и изучать тонкости VBA просто физически нет времени :(

Задача:
Имеем файл Excel 2003 с неизвестным заранее количеством листов в книге.
Последний лист со служебной информацией по выгрузке и на нем нужно создать кнопку привязаную к макросу, который:
- создаст на диске C:\ дирректорию с именем UNLOAD если ее там нет
- в цикле переберет все листы книги исключая последний, который имеет имя info и сохранит каждый из них в отдельный файл с именем соответствующим имени листа, в формате csv и с разделителями ;

Спасибо!
С уважением, Влад.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.11.2004 (Пн) 16:56

Код: Выделить всё
Option Explicit

Sub afdg()
  Dim w As Worksheet
 
  On Error Resume Next
  MkDir "c:\unload"
  On Error GoTo 0
 
  For Each w In ActiveWorkbook.Worksheets
    If w.Name <> "info" Then w.SaveAs "c:\unload\" & w.Name & ".csv", xlCSV
  Next
End Sub


Самое весёлое, что при выполнении этого действия из кода получаем разделители запятые, а если руками, то ; :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

madfrog
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 22.11.2004 (Пн) 15:39

Сообщение madfrog » 22.11.2004 (Пн) 17:47

GSerg Спасибо огромное!
А с запятыми побороться нмкак нельзя? В смысле заменить их на точку с запятой, ибо файл состоит преимуществено из цифр с запятыми и соответственно происходит путаница :(

madfrog
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 22.11.2004 (Пн) 15:39

Сообщение madfrog » 22.11.2004 (Пн) 18:07

PS
и убедить бы его не спрашивать о перезаписи существующего файла...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 22.11.2004 (Пн) 18:37

Перед сохранением выполни Application.DisplayAlerts=False, после сохранения восстанови Application.DisplayAlerts=True.
Что касается запятых, то можно попытаться поэкспериментировать с аргументом Local (последний аргумент метода .SaveAs), а можно выгружать вручную. Открывать файл Open, сохранять через Print # и закрывать файл с помощью Close.
Lasciate ogni speranza, voi ch'entrate.

madfrog
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 22.11.2004 (Пн) 15:39

Сообщение madfrog » 22.11.2004 (Пн) 19:10

С сохранением получилось, а вот на Local ему наплевать :(

а можно выгружать вручную. Открывать файл Open, сохранять через Print # и закрывать файл с помощью Close.

Ужас какой, это как?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.11.2004 (Вт) 11:54

В коде, который дал GSerg, замени строку "Then w.SaveAs "c:\unload\" & w.Name & ".csv", xlCSV" на "Then SaveToCSV w, "c:\unload\" & w.Name & ".csv"". После чего допиши такую процедуру:
Код: Выделить всё
Sub SaveToCSV(Sh As Worksheet, ByVal FileName As String)
Dim FN As Long, C As Long, R As Long, NC As Long, NR As Long, S As String, V As String, fQuote As String
Const strQuote As String = """", strSeparator As String = ";"
Open FileName For Output As #FN
NC = Sh.UsedRange.SpecialCells(xlCellTypeLastCell).Column
NR = Sh.UsedRange.SpecialCells(xlCellTypeLastCell).Row - 1
For R = 0 To NR
  S = vbNullString
  For C = 1 To NC
    fQuote = (R = 0)
    V = Sh.UserRange.Cells(R+1, C).Value
    Select Case Sh.UsedRange.Cells(R+1, C).NumberFormat
      Case "@"
        fQuote = True
      Case "General"
        If Not IsNumeric(Sh.UserRange.Cells(R+1, C).Value) Then
          fQuote = True
        End If
      Case Else
        If Not IsNumeric(Sh.UserRange.Cells(R+1, C).Value) Then
          fQuote = True
        End If
    End Select
    If C > 1 Then S = S & strSeparator
    If fQuote Then
      S = S & strQuote & V & strQuote
    Else
      S = S & strQuote & V & strQuote
    End If
  Next C
  Print #FN, S
Next R
Close #FN
End Sub
Lasciate ogni speranza, voi ch'entrate.

madfrog
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 22.11.2004 (Пн) 15:39

Сообщение madfrog » 23.11.2004 (Вт) 14:39

Спасибо!


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 79

    TopList