Страницы: 1 2 След.
RSS
Формат данных - пропадает часть значения после дроби
 
Добрый день, уважаемые форумчане!

Помогите с проблемой - есть файл, результат сохранения отчета 1С. В нем данные в каком-то непонятном формате: например вижу, что в ячейке "30/120", а при выделении этой ячейки и соответственно получении данных макросом считывается только "30".
Эти хитрые данные можно корректно получить только путем промежуточного копирования через блокнот.
Подскажите, пожалуйста, как корректно работать макросом с такими ячейками? Файл прилагаю.

С уважением, Андрей.
 
вот так попробуйте
Код
Переменная = Cells(3,1).Text
Изменено: webley - 13.04.2015 17:19:25 (немного уточнил)
 
Поставьте на эти ячейки формат "Общий".
Неизлечимых болезней нет, есть неизлечимые люди.
 
TheBestOfTheBest, а как это поможет скопировать значение вместе с правой частью?
 
Никак, так оно разве надо? В условиях написано "как корректно работать макросом с такими ячейками", т.е. правильное значение 30, а 30/120 -неверный формат. Нет?
Неизлечимых болезней нет, есть неизлечимые люди.
 
я так понял как раз наоборот:
например вижу, что в ячейке "30/120", а при выделении этой ячейки и соответственно получении данных макросом считывается только "30"

ладно, ждем автора - ему виднее
 
Доброе утро всем!
Как раз проблема в том, что не копируется часть после дроби, так что нужно скопировать полностью "30/120", а не просто 30
 
Цитата
webley написал: Переменная = Cells(3,1).Text
Это сработало! Большое спасибо!!!!
 
А вот теперь еще вопрос - а как можно это в массив взять без цикла? Кол-во строк более 10 000.

При копировании методом range () не получается...
 
Допустим, у нас строки выгружаются в столбец А с первой строки
Код
Dim arrA()
Dim lngI as Long
lngI=Cells(Rows.Count,1).End(xlUp).Row 'ищем последнюю заполненную строку в столбце А
arrA=Range(A1).Resize(lngI,1) 'массив заполняем значениями диапазона, расширенного от 1 строки до последней заполненной
Debug.Print arrA(lngI,1) 'выводим элемент массива (он двухмерный)


Или что конкретно не получается?
Изменено: Пытливый - 14.04.2015 09:14:55
Кому решение нужно - тот пример и рисует.
 
Цитата
Пытливый написал: При копировании методом range () не получается...
Вы про какое копирование говорите? И ЧТО не получается?
Код
Arr = Range(Cells(1, 1), Cells(10000, 1)).Value
 
Юрий, прилагаю скриншот - сравните данные в столбце листа и то, что макрос берет в массив.
 
Цитата
UnDrew написал: еще вопрос - а как можно это в массив взять без цикла?
Нет. Свойство Text не образует массив.
 
так вроде уже разобрались, что нужно не .Value, а .Text
 
.text вообще не дает формировать массив.
 
Если бы у ячеек был одинаковый числовой формат, можно было бы использовать функцию листа:
Код
Dim a()
a = Application.Text(Range("A3:A16"), Range("A3").NumberFormat)
Но там у ячеек разные форматы. Лучше не заморачиваться.
 
 Ну так формируйте циклом, какие проблемы?
 
Казанский, супер! То, что нужно. Большое спасибо!
 
и вообще, 10т. строк для цикла заполнения массива - не ахти какой объем
стоит ли изобретать велосипед?
 
Ну я считаю, что слишком большой скорости работы макроса не бывает и если можно его ускорить, то нужно ускорить, тем более, что способ, предложенный Казанским отлично работает.
 
Эмм... нарисовал в ячейках В42:В44 данные:
12/30
40/15
30/20
Нарисовал макрос:
Код
Sub t()
Dim arrA()
arrA = Range(Cells(42, 2), Cells(44, 2))
Debug.Print arrA(3, 1)
End Sub

в окошке показывает 30/20
Что я не так делаю?
Кому решение нужно - тот пример и рисует.
 
Пытливый, специально для вас привожу скриншот: (Видимо все же дело в формате ячейки)
 
Цитата
UnDrew написал:
Юрий, прилагаю скриншот - сравните данные в столбце листа и то, что макрос берет в массив.
А теперь Вы сравните:
 
Ну вы наверное видите, что у вас ячейки с зелёными треугольниками, что говорит о том, что это текстовый формат?
А у меня именно какой то непонятный кривой формат, в связи с чем и образовалась проблема. В ином случае я бы конечно просто взял в массив.
 
Цитата
UnDrew написал: ячейки с зелёными треугольниками, что говорит о том, что это текстовый формат?
Конечно: 10/20 не является числом.
 
Нет, значение самой ячейки там именно 30. Действительно, пользовательский формат вида 0"/120";[Красный]-0"/120". Так что, при изменении формата, остается сиротливое 30
 
Если дробное значение на самом деле задаётся форматом, то при таком способе в массив попадут именно фактические значения.
 
Сперва скопировать в буфер, затем
Код
Sub GetWithFormat()
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipboard
        arr = Split(.GetText(1), vbNewLine)
    End With
    [d2].Resize(UBound(arr)) = Application.Transpose(arr)
End Sub

Осторожно с дробями!
 
Update:
Код
Sub GetWithFormat()
    [a2].CurrentRegion.Copy
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipboard
        arr = Split(.GetText(1), vbNewLine)
    End With
    With [d2].Resize(UBound(arr))
        .NumberFormat = "@"
        .Value = Application.Transpose(arr)
    End With
    Application.CutCopyMode = False
End Sub

Осторожно - не потеряйте последний элемент массива! В данном случае он пустой и не нужен, я его отбрезаю. А вообще нужно выгружать в UBound(arr)+1.
Изменено: Hugo - 14.04.2015 11:24:12
 
А что значит скопировать в буфер? Смысл в том, что это должно быть внутри макроса, а как мы выяснили ранее, простое копирование этого диапазона в массив дает значения до дроби...

Или я чего то не понимаю?
Страницы: 1 2 След.
Наверх