Страницы: 1
RSS
Число сохранено как текст - после макроса, а если делать то же руками - то все нормально) в чем подвох?)
 
Доброго времени суток!)
не закидывайте меня, тема избита, но ответа на свой вопрос я не нашел)

ситуация такая - тысячи ячеек с числами вида xy.z, а мне нужен разделитель запятая. делая замену - все хорошо. записываю замену макрорекодером, выполняю макрос - числа сохраняются, как текст о0
гугл дал вот такую хитрость:

Код
With Selection
 .NumberFormat = "#,##0.00"
 .Replace ",", "."
 .Formula = .Formula
End With


не могу попробовать в работе, но, скорее всего, будет пахать. вопрос - почему после выполнения макроса такая ошибка?
вы - гуру экселя, должны знать ответ на такой каверзный вопрос)
 
У меня нормально конветит даже без .Replace ",", "."
 
Потому что при замене из самого Excel - он пытается определить тип данных и преобразовать в верный на его взгляд тип. Если же замену делаете через VBA - то у VBA свои законы и он просто меняет данные, используя метод Excel-я. Никаких проверок типов в данном случае не происходит.
Если применяется формула из VBA, то Excel в любом случае участвует, когда вычисляет формулу. Поэтому преобразование типов так же будет происходить.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
вот это даа, вот это философский ответ) такого в литературе не прочтешь, наверное)
 
философский - это насмешка, судя по смайлу :)

вот так у нас всегда, демократия, тоже ругательное слово, интеллигенция - еще пуще :)

но реально философия икселя такова, что если данные вводятся с клавиатуры, то нет возможности определить компетентность вводящего и применяются определенные методы проверки, а уж если человек дошел до использования макросов, то это что-нибудь  да значит, и проверять его уже надо меньше, он сам позаботится о правильности ввода.
Живи и дай жить..
 
нет, уважаемый Слэн, Вы не правы, это не насмешка, просто улыбка) я, как человек по профессии далекий от программирования, но ощущающий необходимость в его изучении, с уважением отношусь к вещам, которые высказывают гуру на этом сайте. вот сейчас пойду задам еще один вопрос в новой теме)
 
Гы) Все дружно утерлись после peat. ...  :D
Я сам - дурнее всякого примера! ...
 
снова всем доброго времени суток, возникла необходимость поднять тему)

задача все та же - найти точки и заменить их на запятые. только вот чисел стало куда больше - 2 столбца по 100к значений. Вот такой вот нехитрый код

Код
With Range("M5:N" & LastRow)
    .Replace ".", ","
End With

For Each cell In Range("M5:N" & LastRow)
    cell.Formula = CDbl(cell.Formula)
Next cell


работает очень долго и, почему-то, вместо 23.456 получает 23 456, но вместо 0.0123 получает 0,0123)
Гуру, подскажите, как лучше сделать этот код? или вообще бросить затею и обязать пользователя делать замену вручную?
 
пример данных небольшой можно?
Живи и дай жить..
 
Слэн
пожалуйста)

там около 5к значений, чтобы влезло на сайт. в реальности там по 150к значений)конечно, не все они нужны, нужно сделать выборку из них, с которой в дальнейшем и работать. может быть, есть какой-то способ замены в массиве? например, взять из этих 150к каждое 5ое число,занести в массив, там изменить, и добавить на график?
 
Код
Sub q()
Dim ar
ar = [a1].CurrentRegion
'Columns("d:e").NumberFormat = "##0.000"
[g1].Resize(UBound(ar), 2) = ar
End Sub
Живи и дай жить..
 
на 150 тыс отработало секунды за 3 на моем небыстром
Живи и дай жить..
 
Такой стандартный и понятный вариант:

Код
Sub Macro1()
    Columns("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    Columns("B:B").TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
End Sub

Почти ничего не менял в записи рекордера - хотя очевидно есть что сократить.
До например такого:
Код
Sub Macro2()
    Columns("A:A").TextToColumns Destination:=Range("A1")
    Columns("B:B").TextToColumns Destination:=Range("B1")
End Sub

или даже
Код
Sub Macro2()
    Columns(1).TextToColumns [a1]
    Columns(2).TextToColumns [b1]
End Sub
Изменено: Hugo - 30.10.2013 10:15:12
 
Слэн, да, очень быстро работает, спасибо)
Вы не могли бы пояснить синтаксис? в файле-примере работает шикарно, но в моем файле эти данные начинаются не с а1, а с м5 и простая замена результат не приносит - он смещается на пару строк вниз и запятую ставит не там, где надо, а на знак левее (т.е. последнее значение не 30,123, а 3,0123)
Hugo, не знаком с этим методом, к сожалению, с этим методом и последний ваш вариант скопировал данные с точками)
 
Уважаемый Слэн, гугл меня спас, вопрос снимается, спасибо большое)
но остается теоретический вопрос - каким образом работает эта штука?) почему заменяет точки на запятые? это опять происки экселя, который сам соображает, что надо бы заменить?)
Изменено: peat - 30.10.2013 11:28:00
 
"последний ваш вариант скопировал данные с точками" - ну значит там были не "Число сохранено как текст", а текст, похожий на число :)
Т.е. у меня с моими разделителями всё сработало как нужно.
 
Hugo, проблема изначально стояла в замене точек на запятые) но буду знать о таком вот методе избавления от ошибки "сохранено как текст", спасибо большое
 
примерно...

для vba представление с точкой в качестве десятичного разделителя является стандартом. а обратно уже иксель понимает, что числа надо представлять соответственно локали
Живи и дай жить..
Страницы: 1
Наверх