Страницы: 1
RSS
При вставке числа из буфера VBA удаляет запятую
 
Здравствуйте!
Подскажите решение. В буффере обмена табличка с числами, их надо вставить, удалить неразрывный пробел и добавить шапку с заголовком.
Проблема, как ни странно, с этапом вставки из буффера, допустим если в буффере даже только одно число вида "-85,311" код
Код
ActiveSheet.Paste
Вставляет "-85311", и собственно дальше уже бесполезно что-то делать с числами - они искажены.

Как обойти?

Если вставить в excel вручную (ctrl+v), вставляется верно "-85,311" и распознается как число. С удалением неразрывного пробела тоже проблема, так просто его не удалить, вместе с ним удаляется запятая из числа, это обошел так: перебираю выделенные ячейки в цикле с заменой сначала запятой на точку, а потом уже заменой пробела, но вот с пропаданием запятой сразу при вставке не знаю что делать.
 
перед вставкой назначьте ячейкам листа текстовый формат. Далее удалите неразрывный пробел и выполните такую строку кода:
Код
ActiveSheet.UsedRange.FormulaLocal = ActiveSheet.UsedRange.FormulaLocal
должно помочь. Но не видя данных, по одному описанию, это все равно лишь догадки.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
У меня аналогично. А если скопировать "-85.311", то нормально.
Обойти можно так - выгрузить скопированное в текст, в нём заменить запятые на точки, скопировать ещё раз.
Или если без текста - то сперва задать ячейке текстовый формат, затем в неё выгрузить из буфера - но это будет не число, а текст, чтоб с ним работать нужно преобразовать любым способом в число.
Изменено: Hugo - 09.01.2020 17:51:21
 
Код
ActiveSheet.Paste
With ActiveSheet
  Set cur_range = Selection
  cur_range.Activate
  For x = 1 To cur_range.Rows.Count
    For y = 1 To cur_range.Columns.Count
      Z = cur_range(x, y).Value
      Z = Replace(Replace(Z, ",", "."), " ", "")
      cur_range(x, y).NumberFormat = "General"
      cur_range(x, y).Value = Z
    Next y
  Next x
End With
Такой код при изначальном использовании текстового формата ячеек - отрабатывает правильно, и в результате в ячейках получаются числа, а не текст (запятые правда пропадут, если где-то в тексте были, но в моем случае все запятые только в числах). Всем спасибо!
Изменено: Kostushko - 09.01.2020 18:56:55
 
Цитата
Kostushko написал:
числа все же получаются как текст,
а чем это не подошло?
Цитата
Дмитрий(The_Prist) Щербаков написал:
ActiveSheet.UsedRange.FormulaLocal = ActiveSheet.UsedRange.FormulaLocal
Только ActiveSheet.UsedRange на cur_range заменить и все.
Т.е. по сути можно было бы и так попробовать:
Код
ActiveSheet.Cells.NumberFormat = "@"
ActiveSheet.Paste
Set cur_range = Selection
cur_range.Replace " ", ""
ActiveSheet.Cells.NumberFormat = "General"
cur_range.FormulaLocal = cur_range.FormulaLocal
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал: ActiveSheet.UsedRange на cur_range заменить
Такой код без замены точки не отрабатывает, а вот так все ок:
Код
ActiveSheet.Cells.NumberFormat = "@"
ActiveSheet.Paste
Set cur_range = Selection
cur_range.Replace ",", "."
cur_range.Replace " ", ""
ActiveSheet.Cells.NumberFormat = "General"
cur_range.FormulaLocal = cur_range.FormulaLocal
Такой вариант, конечно, короче. Спасибо!
Изменено: Kostushko - 09.01.2020 19:09:19
 
А если так?
Код
With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    .GetFromClipboard
    .setText Replace(.GetText(1), ",", ".")
    .PutInClipboard
End With
ActiveSheet.Paste
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
А если так?
Добавил в ваш код удаление неразрывного пробела, отрабатывает идеально, и не надо изменять формат ячеек на текстовый. Данные вставляются с запятыми, вместо точки и без пробела. Спасибо!
Код
With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    .GetFromClipboard
    .SetText Replace(Replace(.GetText(1), ",", "."), " ", "")
    .PutInClipboard
End With
ActiveSheet.Paste
Страницы: 1
Наверх