2014-11-18 2 views
1

У меня есть база данных Firebird, хранящаяся в кодовой странице Windows-1251 и управляемая с помощью IBExpert. Мне нужно получить информацию о биллинге с помощью SQL, отредактировать ее и затем отправить ее клиентам. Я экспортирую результаты запроса в формат .csv (значения, разделенные запятыми), а затем обрабатываю связку csvs в довольно xls (с границами, шрифтами и т. Д.) С помощью Microsoft Excel 2010. У меня нет идеи, почему, но IBExpert помещает странный символ везде в числовых значениях между десятилетиями (64 731 вместо 64731). Asc() метод от VBA говорит мне, что это символ № 160 в кодовой странице ASCII.
ТЕПЕРЬ, самое странное замечание, которое я сделал: если вы копируете этот символ вручную и удаляете его везде, используя функцию поиска/замены Excel, все в порядке. Если вы делаете то же самое в любом текстовом редакторе (например, старый добрый блокнот), все по-прежнему в порядке. Но когда вы пытаетесь автоматизировать замену с помощью VBA, все идет очень, очень неправильно. Независимо от того, используете ли вы вручную скопированный номер 160 из самого csv или вы его создаете с использованием Chr(160), если вы попытаетесь удалить все эти файлы, VBA также удалит половину запятых. Под запятой я имею в виду общеизвестный символ № 44, вы можете просматривать изображения «ascii» Google и проверять его. Я должен отметить это снова, замена затрагивает половину запятые, однако все они фактически являются тем же самым символом, я повторил это дважды.
Вы можете найти ссылку на csv ниже, так что вы можете успокоить себя тем, что я не сумасшедший.
Вот код, который вы можете использовать, чтобы воспроизвести магияОчень странно Найти/заменить поведение

Sub test() 
    Worksheets(1).UsedRange.Replace What:=Chr(160), Replacement:="" 
End Sub 

Я буду очень благодарен тому, кто прояснит это явление, потому что я просто не могу поверить, что VBA является , что глючит, я думаю, что я что-то пропустил где-то

ОБНОВЛЕНИЕ: Ребята, мне очень жаль. Я настолько тупой, что я загрузил неправильный CSV. Вот right one

+0

У вас есть версия ссылки, которая не сокращается? – pnuts

+0

@pnuts Это не сокращается, черная кнопка с надписью «Скачать» - это ваш выбор. – mekkanizer

+1

. Ваш комментарий о запятой предлагает мне, что он преобразует текст с замененными текстами с текста на номер, который затем отображается как число без запятые. Запятая - это либо тысяча секторов в некоторых локалях, либо децимальный разделитель в других. Например, если я заменяю «» на «234, 567», тогда результат преобразуется в число 234567 (отображается на форматирование числа), хочу ли я этого или нет. Чтобы сохранить тип, вам нужно будет использовать цикл или что-то иное, кроме .Replace, или .replace number format to Text, прежде чем вы удалите символ. –

ответ

1

Я импортировал CSV в Range («A1»). Вот что я нашел:

  • $ F $ 2 = 4 708,200
  • Это значение не детектируется как цифровой. Это связано с CHR(160), существующим на 2-м месте («пробел» после 4).
  • Если вы хотите, чтобы это значение стало 4708200 (четыре миллиона ...), замените CHR (160), как вы это сделали. Это удаляет запятую , потому что теперь Excel выделяет эти значения в виде цифр.
  • Поскольку вы не указали правильную информацию, Excel считает запятую тысяч разделителей.

Если это должно быть довольно 4708,2 (четыре тысячи ...), исправить ее во время импорта CSV:

  • Чтобы правильно импортировать CSV, вы должны поместить CHR (160), как разделитель тысяч.
  • Запятая будет действовать как десятичный знак.
  • Таким образом, Excel будет интерпретировать 4 708,200 как числовое значение 4708,2 во время импорта.

При использовании REPLACE в VBA Excel предполагает, что запятая является разделителем тысяч. Зачем? Сложно сказать. Однако вы не указали, что это НЕ. :)

Ниже приводится код для импорта файла.

With ActiveSheet.QueryTables.Add(Connection:= _ 
    "TEXT;H:\testfile2.csv", Destination:=Range("$A$1")) 
    .Name = "testfile2.csv" 
    .FieldNames = True 
    .RowNumbers = False 
    .FillAdjacentFormulas = False 
    .PreserveFormatting = True 
    .RefreshOnFileOpen = False 
    .RefreshStyle = xlInsertDeleteCells 
    .SavePassword = False 
    .SaveData = True 
    .AdjustColumnWidth = True 
    .RefreshPeriod = 0 
    .TextFilePromptOnRefresh = False 
    .TextFilePlatform = 1251 
    .TextFileStartRow = 1 
    .TextFileParseType = xlDelimited 
    .TextFileTextQualifier = xlTextQualifierDoubleQuote 
    .TextFileConsecutiveDelimiter = False 
    .TextFileTabDelimiter = False 
    .TextFileSemicolonDelimiter = True 
    .TextFileCommaDelimiter = False 
    .TextFileSpaceDelimiter = False 
    .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1) 
    .TextFileThousandsSeparator = Chr(160) ' Here's that thousands separator! 
    .TextFileTrailingMinusNumbers = True 
    .Refresh BackgroundQuery:=False 
End With 

Update: Вот код, который заменяет ваш предыдущий Workbooks.OpenText макрос.

Sub eyecandy() 
Dim SelectedItem 
Dim Wb As Workbook, Sh As Worksheet 
Dim WbName As String, WbFullName As String 

    With Application.FileDialog(msoFileDialogFilePicker) 
     .Title = " " 
     .InitialFileName = ThisWorkbook.Path & Application.PathSeparator & "*.csv" 
     .AllowMultiSelect = True 
     If .Show = False Then Exit Sub 

     Application.ScreenUpdating = False 
     For Each SelectedItem In .SelectedItems 
      Set Wb = Workbooks.Add 

      ' Get the file name 
      WbFullName = Replace(SelectedItem, ThisWorkbook.Path & Application.PathSeparator, "") 
      WbName = Replace(WbFullName, ".csv", "") 

      ' Deletes unnecessary sheets 
      Do Until Wb.Sheets.Count = 1 
       Application.DisplayAlerts = False 
       Wb.Sheets(1).Delete 
       Application.DisplayAlerts = True 
      Loop 

      Set Sh = Wb.Sheets(1) 

      With Sh.QueryTables.Add(Connection:= _ 
       "TEXT;" & SelectedItem, Destination:=Sh.Range("$A$1")) 
       .Name = WbName 
       .FieldNames = True 
       .RowNumbers = False 
       .FillAdjacentFormulas = False 
       .PreserveFormatting = True 
       .RefreshOnFileOpen = False 
       .RefreshStyle = xlInsertDeleteCells 
       .SavePassword = False 
       .SaveData = True 
       .AdjustColumnWidth = True 
       .RefreshPeriod = 0 
       .TextFilePromptOnRefresh = False 
       .TextFilePlatform = 1251 
       .TextFileStartRow = 1 
       .TextFileParseType = xlDelimited 
       .TextFileTextQualifier = xlTextQualifierDoubleQuote 
       .TextFileConsecutiveDelimiter = False 
       .TextFileTabDelimiter = False 
       .TextFileSemicolonDelimiter = True 
       .TextFileCommaDelimiter = False 
       .TextFileSpaceDelimiter = False 
       .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1) 
       .TextFileThousandsSeparator = Chr(160) 
       .TextFileTrailingMinusNumbers = True 
       .Refresh BackgroundQuery:=False 
      End With 
      Sh.Activate 
      ActiveWindow.DisplayGridlines = False 
      With Sh.UsedRange 
       .Borders.LineStyle = xlContinuous 
       .Rows(1).Font.Bold = True 
       .Rows(1).Borders.Weight = xlThick 
      End With 
      Sh.Name = WbName 
      Wb.SaveAs Filename:=WbName, FileFormat:=56 
      Wb.Close SaveChanges:=False 
     Next SelectedItem 
     Application.ScreenUpdating = True 
    End With 
End Sub 
+0

Человек, мне очень жаль, что я потратил ваше время на запись всего этого кода. -Я дал вам неправильный файл, перепроверя вопрос, пожалуйста, я его отредактировал. – mekkanizer

+0

Не стоит беспокоиться. Я обновил свой ответ. Надеюсь, поможет. – TAKL

+0

Ничего себе, спасибо за усилия, написание решения! Осталось еще кое-что уточнить, и это ОЧЕНЬ ВАЖНО **. Когда я использую 'Workbooks.OpenText', чтобы открыть csv I ** MUST **, используйте параметр« Local: = True », иначе все содержимое будет скремблировано во время процесса экспорта, как это сделать с помощью' QueryTables.Add 'метод? Если это может помочь вам как-то, вот [полный код] (http://pastebin.com/wXCjEJyS) – mekkanizer

0

Итак, по предложению @takl решение заключалось в изменении свойства тысяч разделителей. Это .TextFileThousandsSeparator, если вы используете метод ActiveSheet.QueryTables.Add и .ThousandsSeparator, если используете метод Workbooks.OpenText. Я очень ценю его помощь, но у меня есть, чтобы использовать метод Workbooks.OpenText, потому что он поддерживает свойство Local. Итак, вот отредактированный цикл обработки файлов из моего сценария

'walk through selected files 
For Each SelectedItem In .SelectedItems 
    Workbooks.OpenText _ 
     Filename:=SelectedItem, _ 
     Origin:=xlWindows, _ 
     StartRow:=1, _ 
     DataType:=xlDelimited, _ 
     TextQualifier:=xlTextQualifierNone, _ 
     ConsecutiveDelimiter:=False, _ 
     Semicolon:=True, _ 
     ThousandsSeparator:=Chr(160), _ 
     Local:=True 
Смежные вопросы