Страницы: 1
RSS
При парсинге избежать преобразования чисел в экспоненциальный формат
 
Поле Реестровый номер процедуры: на сайте https://www.roseltorg.ru/past/procedure/0131100011418000094 имеет значение 0131100011418000094. После считывания  это поле принимает значение
1,311E+17
Что нужно изменить в коде, чтобы данные считывались в исходным виде.

(Прошу прощения, не нашел как правильно вставить текст макроса. Привожу в "корявом виде")
Код
Sub Пример()
    Workbooks("Пример.xlsm").Worksheets("Парсинг").Cells.Delete
    With Workbooks("Пример.xlsm").Worksheets("Парсинг").Select
    Range("A1:Z1000").Select
    Selection.NumberFormat = "@"
    End With
    With Workbooks("Пример.xlsm").Worksheets("Парсинг").QueryTables.Add("URL;[URL=https://www.roseltorg.ru/past/procedure/0131100011418000094"]https://www.roseltorg.ru/past/procedure/0131100011418000094&quot[/URL];, Workbooks("Пример.xlsm").Worksheets("Парсинг").Range("A1"))
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebDisableDateRecognition = True
        .Refresh BackgroundQuery:=False
    End With
End Sub
 
Код
"" & num
 
Спасибо, но не хватает интеллекта, не соображу куда это вставить. Пожалуйста, поясните подробнее.
 
alpens,
Код
Sub Пример()
    With ThisWorkbook.Worksheets("Парсинг")
        .Cells.Delete
        .Range("B:B").NumberFormat = "@"
        With .QueryTables.Add("URL;https://www.roseltorg.ru/past/procedure/0131100011418000094", Workbooks("Пример.xlsm").Worksheets("Парсинг").Range("A1"))
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .WebFormatting = xlWebFormattingNone
            .WebPreFormattedTextToColumns = True
            .WebDisableDateRecognition = True
            .Refresh BackgroundQuery:=False
        End With
        .Range("B1") = .Range("B1").FormulaLocal
    End With
End Sub
 
Спасибо, полегчало, но не намного.
Теперь получаю 131100011418000000, а надо бы 0131100011418000094, как на сайте.
 
alpens, может вам проще сразу с URL брать эти данные?
Код
    With ThisWorkbook.Worksheets("Парсинг")
        .Cells.Delete
        .Range("B:B").NumberFormat = "@"
        URL = "https://www.roseltorg.ru/past/procedure/0131100011418000094"
        With .QueryTables.Add("URL;" & URL, Workbooks("Пример.xlsm").Worksheets("Парсинг").Range("A1"))
            .FillAdjacentFormulas = False
            .PreserveFormatting = True
            .RefreshOnFileOpen = False
            .WebFormatting = xlWebFormattingNone
            .WebPreFormattedTextToColumns = True
            .WebDisableDateRecognition = True
            .Refresh BackgroundQuery:=False
        End With
        .Range("B1") = Split(URL, "/")(UBound(Split(URL, "/")))
    End With
 
Нет, так применимо только в данном конкретном примере.
На самом деле обрабатываются разные сайты и в URL далеко не всегда присутствует нужный номер (как в данном случае).
Нужен прием, который обеспечивает адекватное представление полей сайта, содержащих длинный цифровой код.  
 
текст - вот адекватное представление любой буквенно-цифровой информации
буковка за буковкой, циферка за циферкой и в любых сочетаниях! хотя есть и тут подводные камни, когда некоторые сочетания символом отображаются потом как смайлик ;)
думаете я это рисовал? просто написал ; и ) только вместе, а не через пробелы с и в средине.
Изменено: Ігор Гончаренко - 10.04.2018 23:39:10
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Согласен, "текст - это наше все"  :)
Поэтому и вставил в свой код Selection.NumberFormat = "@" перед считыванием данных сайта. После считывания формат ячеек остается текстовым, однако происходит преобразование в экспоненту. что нужно еще ?
 
alpens,
Цитата
alpens написал:
Нужен прием, который обеспечивает адекватное представление полей сайта, содержащих длинный цифровой код.  
Используйте Power Query
 
Если эти номера процедур имеют установленный формат - можно эти нули добавить позже согласно этого формата. - не, не пойдёт, данные уже испорчены...
Изменено: Hugo - 11.04.2018 17:49:01
 
alpens, не так давно столкнулся с похожей ситуацией. Решил ее, как и писал выше:
- текстовый формат ячеек-приемщиков
- перед вставкой к каждому такому числу прилепляется "" (пустая строка)

Пример - в ячейку "А1" вставляем такую беду:
Код
[A1].NumberFormat="@"
a="0012458745879654125533"
[A1] = "" & CStr(a)
 
Цитата
Anchoret написал:
перед вставкой к каждому такому числу прилепляется "" (пустая строка)
Данные вставляются запросом QueryTabl. Как туда прикрутить предлагаемое Вами ?
 
Цитата
Jungl написал:
Используйте Power Query
Пример запроса можно ?
 
alpens, адаптируйте под свой код :
Код
Sub test()
Dim aa, a&, URL$
URL = "01234/004563/09871"
aa = Split(URL, "/")
For a = 0 To UBound(aa): aa(a) = "" & aa(a): Next
[B1].Resize(a).NumberFormat = "@"
[B1].Resize(a) = Application.Transpose(aa)
End Sub
 
Цитата
Anchoret написал:
"" (пустая строка)
А почем просто не c апострофом?
Код
[A1] = "'" & CStr(a)
По вопросам из тем форума, личку не читаю.
 
Anchoret, Вы обрабатываете текстовую строку, выделяя нужный фрагмент и преобразовывая его. У меня данные считываются с сайта запросом QueryTable. После считывания в ячейке уже обрезанное значение 131100011418000000, а надо бы 0131100011418000094, как на сайте. Как этого избежать? Видимо нужно задать правильное сочетание свойств QueryTable. Но какое ?
 
alpens, полагаю дело не в QueryTable, а в Excel, который любит додумывать все за пользователей. Выгрузка идет напрямую на лист. Если как-то обойти и выгружать в массив, то шанс победить есть) Лично я с Query не работал.

Перехватывать сам факт выгрузки тоже ничего не даст, т.к. данные уже на листе.
 
Anchoret,Спасибо! Про массив хорошая идея. Но слету не соображу как. Парсятся разные сайты. заранее не известно в каком месте окажется длинное число.
 
Цитата
Цитата
Jungl написал:
Используйте Power Query
Power Query исппользовать не смог:
1. не нашел примера его использования в макросах VBA;
2. если правильно понял Power Query предполагает знание структуры сайта. Импорт каждой табл. сайта производится на отдельный лист, что затрудняет обработку данных, тогда как QueryTabl позволяет импортировать все данные сайта на один лист.

Цитата
Anchoret написал:
Если как-то обойти и выгружать в массив, то шанс победить есть
Вероятно, нужно выгружать не в массив, а в переменную типа QueryTable. Что-то вроде

Dim QT1 As QueryTable
Set QT1 = .QueryTables.Add("URL;https://www.roseltorg.ru/past/procedure/0131100011418000094", Range("A1"))

Если затем

QT1.Refresh

то данные записываются на лист.

Не смог найти способ найти нужное поле в переменной QT1, чтобы обработать его значение.
Как можно это сделать ?
 
Цитата
alpens написал:
Не смог найти способ найти нужное поле в переменной QT1, чтобы обработать его значение.
Смог.
Данные в QT1 появляются также после QT1.Refresh и поле Value2 содержит 1,311000011418Е+17, т.е. тоже обрезано. Тип этого поля Variant/Double.
Как сделать, чтобы все поля были Variant/String. Есть ли настройка ?
Страницы: 1
Наверх