Здравствуйте! У меня вопрос выгрузки текстовых значений (числа как текст, ведущие нули) из массива в макросе в ячейки. Не люблю использовать массивы в коде VBA, так как летит форматирование к черту... И чтобы все данные без потери их значимости были выгружены из массива, надо шаманить с форматами. Если таблицы огромные и столбцов под сотню, вообще грустно. Подскажите как избежать ручного форматирования исходных данных в текстовый или перевод форматирования данных в текстовый в коде (это долго, да и пропустить можно, а значит "повтори сначала").
Где я сказал что нужно лезть в массив и ставить апострофы руками? Я даже не знаю как это сделать технически )) Пишите один цикл, или добавляете в тот код который уже что-то с этим массивом делает
Цитата
Ma_Ri написал: выгрузки текстовых значений (числа как текст, ведущие нули) из массива в макросе в ячейки.
- вижу код, массив, значит просто дописать функционал сохранения этих нулей.
Ma_Ri написал: Не люблю использовать массивы в коде VBA, так как летит форматирование к черту...
Excel, все таки, в первую очередь Табличный редактор, а не Текстовый процессор. Да, форматирование и прочая 'красота' (объединенные ячейки, стили, УФ), как правило, враг быстрой и удобной работы с данными. Тут надо определяться - 'шашечки' или ехать Скорость работы с данными в массиве кратно (а то и на ПОРЯДКИ) быстрее такой же работы с диапазонами, со всем их форматированием. ИМХО, как говориться)
Согласие есть продукт при полном непротивлении сторон
Ma_Ri написал: представьте себе, что я не знаю в каких столбцах будут эти числа как текст
- на практике такого не бывает, всегда это заранее известно. Ну или если юзер непредсказуем в поведении - можно поискать по заголовкам где лежат всякие SKU, артикулы, ID, штрихкоды...
Hugo, давайте не будем спешить с такими выводами...
Цитата
Hugo, написал: Ну или если юзер непредсказуем в поведении...
Да, есть таблица и видно сколько столбцов и возможно проанализировать с какими данными мы будем работать, но вопрос то не в этом. Как минимизировать этот процесс и избавить от ручного выбора и определения форматирования.
Hugo, написал: можно поискать по заголовкам где лежат всякие SKU, артикулы, ID, штрихкоды...
Это тоже не вариант, так как могут отправить файлы с разной выгрузкой (столбцы с данными расположены в разных файлах по-разному, количество столбцов разное...). Возможный вариант, например, берем первую строку с данными и проверяем, какой тип данных в каждом столбце и устанавливаем соответствующий формат на весь столбец с данными (если число - числовой, текст - текстовый). Так возможно сделать в коде VBA? Или смотреть в сторону PQ?
Здравствуйте! Sanja, Нашла функцию TypeName для определения типа данных.И вроде бы получилось по задуманному варианту применить. Проверяю тип данных в источнике и такой же устанавливаю на новом Листе. Частично получилось решить задачу, ведущие нули на месте и числа как текст в порядке, кроме числового формата. Так как она видит число в ячейке, определяет его тип как "Double" и для целого и десятичного числа. Я могу соответственно задать формат либо "0" либо "#,##0.00", разные форматы (для целого и десятичного числа) не получится. Возможно и другие неприятности могут возникнуть, но пока вот так... И как с этим быть? Возможно есть и другие варианты? Ваше мнение..? Примерный код тестовый приложила, сделала специально форматирование отдельным кодом. UPD: Можно в принципе оставить формат общий для чисел и не заморачиваться с форматированием (
Скрытый текст
Код
Sub CopyData()
Dim wb As Workbook
Dim ws1 As Worksheet, ws2 As Worksheet
Dim arr1, arr2
Dim i&, j&, n&, lr&
Set wb = ThisWorkbook
Set ws1 = wb.Worksheets("XX_XXX_01")
Set ws2 = wb.Sheets.Add(After:=Sheets(Sheets.Count))
ws2.Name = "XX_XXX"
lr = ws1.Cells(Rows.Count, 7).End(xlUp).Row
ws1.Range("A1:O1").Copy
ws2.Range("A1:O1").PasteSpecial Paste:=xlPasteColumnWidths
ws1.Range("A1:O1").Copy
ws2.Range("A1:O1").PasteSpecial
arr1 = ws1.Range("A2:O" & lr).Value
ReDim arr2(1 To UBound(arr1, 1), 1 To UBound(arr1, 2))
n = 0
For i = 1 To UBound(arr1, 1)
If arr1(i, 1) <> "1" Then
n = n + 1
For j = 1 To UBound(arr1, 2)
arr2(n, j) = arr1(i, j)
Next j
End If
Next i
If n > 0 Then
Call FormatColumns
ws2.Range("A2").Resize(UBound(arr2, 1), UBound(arr2, 2)).Value = arr2
Else
MsgBox "Нет данных!", vbInformation
End If
End Sub
Sub FormatColumns()
Dim ws As Worksheet, ws2 As Worksheet
Dim lastCol&, i&
Dim cellVal
Dim col As Range
Set ws = ThisWorkbook.Sheets("XX_XXX_01")
Set ws2 = ThisWorkbook.Sheets("XX_XXX")
lastCol = ws.Cells(2, ws.Columns.Count).End(xlToLeft).Column
For i = 1 To lastCol
Set col = ws2.Columns(i)
cellVal = ws.Cells(2, i).Value
Select Case TypeName(cellVal)
Case "String"
col.NumberFormat = "@"
Case "Integer"
col.NumberFormat = "0"
Case "Double"
col.NumberFormat = "#,##0.00"
Case "Date"
col.NumberFormat = "dd.mm.yyyy"
End Select
Next i
End Sub