У меня есть рабочая тетрадь с листом для отображения группы данных.
Первая строка - это строка заголовка, и каждый столбец связан с определенным форматом.
Этот лист обновляется автоматически (с помощью кода макроса VBA) из внешнего источника данных (импорт файла).
После обновления значения данных формат также обновляется (и применяется так, что он применяется к новым строкам). В следующем фрагменте кода rColumn - диапазон столбца данных под заголовком.
rColumn начинаться со строки 2, а заголовок - со строки 1. sType - это тип, связанный с заголовком:
On Error GoTo ErrorHandler
With rColumn
.Validation.Delete
Select Case sType
Case "text"
.Value = CStr(.Value)
.NumberFormat = "@"
Case "integer"
.Value = CLng(.Value)
.NumberFormat = "0"
Case "float"
.Value = CDbl(.Value)
.NumberFormat = "0.0"
Case "percentage"
For Each c In rColumn
.Value = CDbl(.Value)
Next c
.NumberFormat = "0.00%"
Case "Image"
.NumberFormat = "@"
Case "currency euro"
.Value = CDbl(.Value)
.NumberFormat = "#,##0.00 $"
Case "currency USD"
.Value = CDbl(.Value)
.NumberFormat = "#,##0.00 [$USD]"
End Select
End With 'rColumn
когда я проверяю формат ячейки, все в порядке, и я вижу, что был установлен формат столбца.
Что странно, так это то, что клетки отображаются не так, как ожидалось. В приведенном ниже примере столбец 03ATT долл. США ожидается в качестве валюты для доллара США, а 04ATT кур в качестве валюты для евро ...
Если я выберу ячейку, скажем одну со значением 3 в 03ATT cur USD столбец
и подтвердите его (нажав клавишу ввода - обратите внимание, я не изменяю значение в ячейке), тогда применяется ожидаемый формат.
Я должен отметить, что перед обновлением данных графический интерфейс и обновление вычислений отключены (для ускорения процесса) с помощью следующего кода:
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.Calculation = xlCalculationManual
но после обновления данных и форматирования они сбрасываются, так что графический интерфейс обновляется:
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
здесь возникает вопрос, почему я не получаю правильный формат при применении формата, как показано в коде блока (верхняя часть этого поста).
Я использую Excel 2016 на Win 10.
С учетом комментария к этому сообщению кажется, что проблема заключается в преобразовании значения ячейки данных (фактически значения диапазона ячеек) из одного цифрового представления в другое. Целевое представление должно быть совместимо с исходным значением. Применение преобразования, такого как CStr (), CLgn () и т. Д., Вызывает ошибку 13 «несоответствие типов» в той же строке, где происходит преобразование. Описание, которое говорит само за себя, но я не могу понять, в чем проблема. Например, значение 9535 (которое в did является целым числом - на самом деле Long в VBA лучше), преобразованное с помощью CLng (), с треском проваливается. Какого черта ? Мне интересно, может ли преобразование быть применено к значению диапазона?