Excel 2007 Сохранить лист как CSV отличается, чтобы сохранить лист как CSV в VBA - PullRequest
2 голосов
/ 29 декабря 2011

У меня проблема с работой с некоторыми рабочими листами из стороннего веб-сайта.

Это список данных футбольных матчей.

Manual Save as CSV
Теперь, когда эта электронная таблица «EC» находится в фокусе, и я перехожу к SAVE AS и выбираю .CSV, тогда электронная таблица сохраняется как CSV, и данные идеальны. то есть даты в столбце «B» и они должны быть такими, какими они должны быть в формате ДД / ММ / ГГГГ.

EG, взято из последнего ряда листа ЕС EC, 24/04/2010, Tamworth, Ebbsfleet

Это правильно, если я захожу в меню и выбираю «СОХРАНИТЬ КАК», выбираю CSV и принимаю все запросы, чтобы сохранить его в формате CSV, бла-бла, файл CSV сохраняется как EC, 24/04/2010, Tamworth, Ebbsfleet

Это верно, так как даты в Великобритании дд / мм / гггг

VBA Save as CSV
Теперь сделать все намного проще для себя, так как мне нужно сохранить каждый рабочий лист как файл csv, поэтому я использую приведенный ниже код VBA для автоматического сохранения каждого рабочего листа в текущем каталоге с именем worksheetname.csv (например, EC. csv) каждый раз, когда рабочая книга закрывается, это приводит к изменению дат в столбце B на формат Americam MM / DD / YYYY.

Однако, используя VBA для сохранения в формате CSV, данные заканчиваются как EC, 4/24 / 2010, Tamworth, Ebbsfleet

Обратите внимание на изменение с британского дд / мм / гггг на ныне американский формат мм / дд / гггг

Как я могу внести изменения в VBA, чтобы сохранить даты в формате, указанном в фактической электронной таблице, т.е. дд / мм / гггг, при сохранении в vba в CSV?

Мне нужна эта опция CSV для работы в VBA, так как эти и многие другие подобные электронные таблицы сохраняются в виде файлов CSV для импорта КАЖДЫЙ ДЕНЬ.

My settings

Я использую Excel 2007 на компьютере с Win 7 (64bit) здесь, в Великобритании.

Я также попытался добавить Local: = True к ws.SaveAs, но это не имело никакого значения. т.е. даты сохраняются как EC, 4/24/2010, Tamworth, Ebbsfleet при сохранении из VBA

Спасибо

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Alerts_Suppress
ThisWorkbook.Save
Save_All_WorkSheets_As_CSV
Alerts_Enable
ActiveWorkbook.Close False
Application.Quit
End Sub


Sub Save_All_WorkSheets_As_CSV()

Dim Name As String
Dim Current_Directory As String
Dim ws As Worksheet
Dim wb As Workbook
Set wb = ActiveWorkbook
Dim i As Integer
i = 0

Current_Directory = ActiveWorkbook.Path & "\"
For Each ws In wb.Worksheets
    Name = Current_Directory & LCase(ws.Name) + ".csv"
    ws.SaveAs Name, xlCSV
    i = i + 1
Next

End Sub

Sub Alerts_Suppress()
Application.DisplayAlerts = False
End Sub

Sub Alerts_Enable()
Application.DisplayAlerts = True
End Sub

Ответы [ 5 ]

2 голосов
/ 29 декабря 2011

Это, кажется, присущая «проблема» с vba, и я считаю, что единственное решение - отформатировать ваше поле даты в текстовое поле перед экспортом, очевидно, измените Selection на фактический диапазон

Sub convertToStr()
  Dim c As Range

  For Each c In Selection
    c.Value = "'" + CStr(c.Value)
  Next c

End Sub
1 голос
/ 30 декабря 2011

Мне удалось повторить проблему, как описано.Мои региональные настройки - новозеландский английский.Настройка: Excel 2010 32-битная, Win7 64-битная

Я много раз использовал файлы csv в Excel много лет, и обычно обнаружил, что работа с CSV в Excel очень непостоянна.Я склонен писать свои собственные обработчики CSV.

Вот пример.Вам нужно будет изменить его в соответствии с вашими потребностями.Например, обрабатывать то, что вы хотите и не хотите "" 'd и включать или исключать пустые ячейки и т. Д.

Sub SaveAsCsv(ws As Worksheet, Name As String)
    Dim fso As FileSystemObject
    Dim fl As TextStream
    Dim dat  As Variant
    Dim rw As Long, col As Long
    Dim ln As String
    Dim Quote As String

    On Error GoTo EH

    Set fso = New FileSystemObject
    Set fl = fso.CreateTextFile(Name, True)
    dat = ws.UsedRange
    For rw = 1 To UBound(dat, 1)
        ln = ""
        For col = 1 To UBound(dat, 2)
            ' Modify this section to suit your needs
            If dat(rw, col) <> "" Then
                If IsNumeric(dat(rw, col)) Or _
                  IsDate(dat(rw, col)) Then
                    Quote = ""
                Else
                    Quote = """"
                End If
                ln = ln & Quote & dat(rw, col) & Quote & ","
            End If
        Next col
        fl.WriteLine Left(ln, Len(ln) - 1)
    Next rw


EH:
    On Error Resume Next
    If Not fl Is Nothing Then fl.Close
    Set fl = Nothing
    Set fso = Nothing

End Sub

Включает раннюю ссылку на Microsoft Scripting Runtime, поэтому установите ссылку или измените на позднююесли хотите.

Чтобы использовать его в своем коде, соотнесите ws.SaveAs Name, xlCSV с SaveAsCsv ws, Name

0 голосов
/ 13 августа 2016

Если вы столкнулись с похожими проблемами, запишите макрос и сравните сгенерированный код с вашим. Обратите внимание, что он использует Workbook.SaveAs вместо

For Each ws In wb.Worksheets
    ws.Activate
    wb.SaveAs Current_Directory & LCase(ws.Name) & ".csv", xlCSV ' check this line with Record Macro
Next
0 голосов
/ 12 августа 2016

Это тот случай, если вы используете SaveAs из меню Excel, но не используете VBA. Изменение региональных настроек не влияет на отображение даты VBA в американский формат. Но добавление приведенного ниже утверждения исправило его для меня, как предложено выше.

ws.Columns("B:B").NumberFormat = "dd/mm/yyyy" 
0 голосов
/ 29 декабря 2011

Месяц или около того назад меня сбили с толку, когда я отошел в сторону Excel, иногда конвертирующего даты Великобритании, которые могут быть действительными датами США в даты США. Таким образом, 1/4/11 (1 апреля 11) станет 4/1/11 (4 января 11), а 13/4/11 (13 апреля 11) не изменится. Я не мог продублировать проблему, поэтому вынужден был признать, что допустил ошибку.

Я сталкивался с этой проблемой восемь или девять лет назад, и с тех пор я всегда передавал даты в формате "1 апреля 2011", чтобы избежать этой проблемы. Ваш вопрос предполагал, что я был прав, но в корне проблемы было что-то кроме Excel.

Я создал рабочий лист с числами, датами и строками. Он сохранен в виде файла CSV, как я хотел бы.

Я зашел в Панель управления и изменил свое местоположение на "Соединенные Штаты". Я снова сохранил лист, и на этот раз даты в CSV-файле были «американизированы», как описано выше.

Я восстановил свое местоположение в "Соединенном Королевстве". Мой третий CSV-файл снова был верным.

Вы утверждаете, что настройки панели управления верны. Я думаю, вам нужно проверить еще раз и найти что-нибудь еще, что может быть не так, поскольку теперь я знаю, как включать и выключать этот эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...