Десятичная строка преобразуется в числовой формат при назначении с помощью .Value () - PullRequest
0 голосов
/ 02 июля 2018

У меня есть набор данных, в котором мне нужно передать данные, чтобы они соответствовали формату, который используется для интерпретации этих данных. Для этого мне нужно объединить два столбца данных в один столбец. Для этого я вставляю данные второго столбца ниже данных в первом столбце.

Для этого я сначала добавляю необходимое количество пустых строк в нужное место. Затем мне нужно продублировать легенду, которая сопровождает эти данные. Легенда имеет два столбца: один с идентификаторами вопросов, а другой с вопросами.

При дублировании этой легенды происходит неявное преобразование типов, которое является нежелательным.

Я использую следующий код для дублирования легенды:

Dim j as long
For j = 1 To numberrows_kennis 
   wss.cells(lastrow_kennis + j , 1) = wss.cells(row_kennis -1 + j , 1).Value
   wss.cells(lastrow_kennis + j , 2) = wss.cells(row_kennis -1 + j , 2).Value
Next j

В этом коде все переменные явно объявлены как соответствующий тип (worksheet для wss, Long для переменных, связанных со строкой)

Когда я запускаю этот код, большая часть копирования идет правильно, за исключением одного значения. Существует значение 3.2, которое хранится в виде строки, так как я использую европейскую версию Excel. Когда я копирую это, оно преобразуется в десятичное значение вместо строки: 3,2.

Остальная часть диапазона, подлежащего копированию, является значениями типа Long, которые не следует преобразовывать в строковые значения.

Происходит ли это преобразование типов из-за моего использования .Value? И если да, то как избежать такого поведения?

1 Ответ

0 голосов
/ 02 июля 2018

Это Excel пытается быть полезным. Чтобы избежать автоматического преобразования, вы должны либо ставить перед апострофом значение при назначении его ячейке, либо использовать текстовый формат для ячейки перед вводом значения в нее, например:

wss.cells(lastrow_kennis + j , 1) = "'" & wss.cells(row_kennis -1 + j , 1).Value

или

wss.cells(lastrow_kennis + j, 1).NumberFormat = "@"
...