Страницы: 1
RSS
Сохранение текстового формата, VBA
 
Вечер добрый.
Делаю ссылку на диапазон - Set x1 = Range(Cells(17, 2), Cells(Cells(17, 2).End(xlDown).Row - 1, 2)) и сразу вижу в окне Locals, что он из текстового формата превращается в числовой. Т.е. когда впереди кода идут нули, к примеру 0450000400, то они обрубаются - 450000400. А это не есть хорошо, мне бы зафиксировать их "045000.."
Подскажите пожалуйста, как сохранить текстовой формат, чтобы при выгрузке видно было такой же формат  - 0450000400.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Что в локалс, где в локалс, что за он? x1 - это ведь объект, причём там числа?
Изменено: Hugo - 29.07.2015 17:19:28
 
Цитата
Владимир написал:
вижу в окне Locals, что он из текстового формата превращается в числовой
Значит, в диапазоне хранятся числа, а ведущие нули сделаны форматом ячейки.
Можно применить формат ячейки к значениям с помощью такой функции, там же пример использования.
Код
Function FormattedValue(rng As Range, Optional fmt)
'---------------------------------------------------------------------------------------
' Procedure : FormattedValue
' Author    : Казанский, exceleved@yandex.ru
' Date      : 29.07.2015
' Purpose   : Возвращает отформатированное значение/массив значений диапазона
'           :
' Arguments : rng - ячейка или прямоугольный диапазон
'           : fmt - формат, пригодный для использования в функции ТЕКСТ(TEXT) в американской локали
'           : если fmt опущен, берется числовой формат первой ячейки диапазона
' Ret.Value : Variant/String или Variant/Variant()
'---------------------------------------------------------------------------------------

  If IsMissing(fmt) Then fmt = rng(1).NumberFormat
  If rng.Count > 1 Then
    FormattedValue = Evaluate("INDEX(TEXT(" & rng.Address(, , Application.ReferenceStyle, True) & ",""" & fmt & """),)")
  Else
    FormattedValue = Evaluate("TEXT(" & rng.Address(, , Application.ReferenceStyle, True) & ",""" & fmt & """)")
  End If
End Function

Sub test()
Dim x, v()
  x = FormattedValue([b1])
  v = FormattedValue([b1:c9], "000-000-000")
End Sub
 
Владимир, если я правильно понял вопрос, то можно так сохранить нули при выгрузке текстовых значений из VBA-массива в ячейки:
Код
Sub Test()
  
  Dim Rng As Range, v()
  
  ' Задать тестовый диапазон ячеек
  Set Rng = Range("A1:A2")
  
  ' Записать в A1:A2 тестовый текст с начальными нулями
  Rng.Value = "0450000400"
  
  ' Считать текст в VBA-массив
  v() = Rng.Value
  
  ' Убедиться, что начальные нули в vba-массиве есть (т.е. там текст)
  Debug.Print v(1, 1), v(2, 1)
  
  ' Чтобы скопировать массив  v() в другой диапазон B1:B2, и чтобы нули остались,
  ' нужно сначала задать текстовый формат ячейкам назначения
  Rng.Offset(0, 1).NumberFormat = "@"
  
  ' В ячейки B1:B2 будет "выгружен" текст из v() с начальными нулями, а не числа без начальных нулей
  Rng.Offset(0, 1).Value = v()
  
  ' Теперь можно восстановить в B1:B2, например, общий формат, начальные нули при этом останутся
  Rng.Offset(0, 1).NumberFormat = "General"
  
End Sub
Изменено: ZVI - 30.07.2015 06:44:46
 
<<Rng.Value = "0450000400">>
Нет, Владимир, мне не нужно переписывать значения на константу.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
У Вас в A2:A5 не текст, а числа с форматом ячеек "0000000000".
Тогда используйте функцию Алексея из сообщения #3 и предложенное форматирование:
Код
Sub qqq()
  Dim rng As Range, v()
  Set rng = Range("a2:a5")
  v() = FormattedValue(rng)
  rng.Offset(0, 1).NumberFormat = "@"
  rng.Offset(0, 1).Value = v()
  rng.Offset(0, 1).NumberFormat = "General"
End Sub
 
Цитата
Владимир написал:
как сохранить текстовой формат, чтобы при выгрузке видно было такой же формат  - 0450000400.
просто скопировать исходный формат. Я в примере скопировал - оба столбца стали совершенно одинаковыми.
Или объясните задачу как-нибудь иначе - ничего не понятно.
 
Код
Sub export()
Dim oWb As Workbook
Dim x1 As Range, x2 As Range, x3 As Range
Dim lstr%, i&, n&, ii&
Set oWb = ActiveWorkbook
'Задаём объекты (ссылки на диапазоны данных) в файле источнике
Set x1 = Range([b17], Cells([b17].End(xlDown).Row, 2 - 1))  
Set x2 = Range([g17], Cells([g17].End(xlDown).Row, 7))
Set x3 = Range([m17], Cells([m17].End(xlDown).Row - 1, 13))
Workbooks.Open FileName:="F:\Логистика\Шаблон заказа поставщику.XLS" 'Открываем шаблон
With Sheets("Шаблон")
 .Range("A:L").ClearContents 'Чистим дипазоны в шаблоне
 Columns(7).Interior.ColorIndex = xlNone
 Columns(1).NumberFormat = "@"
 [a1].Resize(x1.Cells.Count, 1).Value = x1.Value
 [h1].Resize(x2.Cells.Count, 1).Value = x2.Value
 [i1].Resize(x3.Cells.Count, 1).Value = x3.Value
End With
end sub
Копирую данные из накладной поставщика в файл "Шаблон заказа поставщику.xls" для загрузки в программу 1С.
x1 - коды запчасти
x2 - количество
x3 - цена
Проблема только с диапазоном x1. Т.е. если код неправильный, то он не сэкспортируется в базу, т.к. не найдёт соответствия в ней.
Накладную прицепил.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Если копировать кодом - то копируйте не .value, а .text, но не сразу весь диапазон/массив, а поячеечно.
Изменено: Hugo - 30.07.2015 09:43:07
 
Цитата
Hugo написал: а поячеечно
поячеечно - это циклом?
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Да, циклом по ячейкам x1.
Ну или не копируйте через массив значения, а копируйте диапазон целиком со всеми форматами - если конечно такой вариант поймёт ваша база при загрузке.
Изменено: Hugo - 30.07.2015 10:12:16
 
Код
Sub export()
    Dim oWb As Workbook
    Dim x1 As Range, x2 As Range, x3 As Range
    Dim lstr%, i&, n&, ii&
    Set oWb = ActiveWorkbook
    'Задаём объекты (ссылки на диапазоны данных) в файле источнике
    Set x1 = Range(Cells(17, "B"), Cells(17, "B").End(xlDown).Offset(-1))
    Set x2 = x1.Offset(, 5)
    Set x3 = x1.Offset(, 11)
'    Set x1 = Range([b17], Cells([b17].End(xlDown).Row, 2 - 1))
'    Set x2 = Range([g17], Cells([g17].End(xlDown).Row, 7))
'    Set x3 = Range([m17], Cells([m17].End(xlDown).Row - 1, 13))
    Workbooks.Open Filename:="F:\Логистика\Шаблон заказа поставщику.XLS"    'Открываем шаблон
    With Sheets("Шаблон")
    With Sheets(2)
        .Range("A:L").ClearContents    'Чистим дипазоны в шаблоне
        .Columns(7).Interior.ColorIndex = xlNone
'        .Columns(1).NumberFormat = "@"
        Dim arr(): arr() = x1.Value
        For i = LBound(arr) To UBound(arr)
            arr(i, 1) = "'" & Format(arr(i, 1), "0000000000")
        Next
        .[a1].Resize(x1.Cells.Count, 1).Value = arr
        ' [a1].Resize(x1.Cells.Count, 1).Value = x1.Value
        .[h1].Resize(x2.Cells.Count, 1).Value = x2.Value
        .[i1].Resize(x3.Cells.Count, 1).Value = x3.Value
    End With
End Sub
 
Андрей, с нулём проблема решается, но появляется другая. Код 581622E000 из-за буквы E превращается в  "'0000581622", что тоже ни есть хорошо.  
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Ну а как мой вариант?
 
Ваш вариант пока не пробовал - работа. Вечерком посвободней буду.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Тады так его
       
Код
Dim arr(): arr() = x1.Formula
        For i = LBound(arr) To UBound(arr)
            arr(i, 1) = "'" & CStr(arr(i, 1))
 
Formula не пойдёт:
     : arr(3,1) : "2340234" : Variant/String
 
Цитата
RAN написал: Тады так его

:D ..а так ноль теряется.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
в сообщении #9 от Hugo - единственно правильный вариант.
следующие 9 сообщений в теме - так и не понял для чего :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
По совету Игоря получилось так:
Код
Set x1 = Range(Cells(17, "B"), Cells(17, "B").End(xlDown).Offset(-1))
Set x2 = x1.Offset(, 5)
Set x3 = x1.Offset(, 11)
..
...
[h1].Resize(x2.Cells.Count, 1).Value = x2.Value
[i1].Resize(x3.Cells.Count, 1).Value = x3.Value
End With
lstr = Cells(Rows.Count, 8).End(xlUp).Row
If [h1] = 0 Then MsgBox "Неправильно выбран поставщик", , Error: Exit Sub
     For i = 1 To lstr
        Cells(i, 1) = x1(i, 1).Text
...........
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
гм... и работает?
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
А чё не работать :)
Только не забудьте задать формат ячейкам - а то Эксель может опять сам без спросу съесть эти нули.
 
Цитата
Hugo написал: А чё не работать
Только не забудьте задать формат ячейкам
ну так и я про то же :)
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Ребята, всем спасибо и доброго здоровья.

---------
Алексей, твой вариант слишком сложный для меня, так и не разобрался. Твоя функция создаёт 2 столбца 1 из которых - ноль, а второй - число. А как оно дальше, так и не прикрутил.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
Страницы: 1
Наверх