VBA - excel забывает запятую при вставке внешних данных

Я пытаюсь написать код vba, используя метод DDE. Код предназначен для копирования набора столбцов таблицы excel и вставки его в параметрическую таблицу в программное обеспечение EES (Engineering Equation Solver). Затем для решения таблицы запускается код EES, генерирующий столбцы выходных данных. Эти данные затем копируются и вставляются обратно в файл excel, содержащий входные данные.

Поскольку я новичок в vba, я использовал пример, предоставленный EES (Выполнение команд макроса EES из EXCEL) в качестве ориентира.

Проблема возникает, когда данные вставляются обратно в электронную таблицу excel: код, кажется, игнорирует десятичный разделитель! Как мои excel, так и EES настроены на работу с запятой в качестве разделителя с десятичной запятой, и когда я вручную копирую результаты из EES и вставляю, чтобы превзойти число, вставленное нормально, с запятой (также цифры из excel правильно вставлены в ESS).

Однако, когда я устанавливаю код для выполнения этой задачи, числа, такие как "15,47", вставляются в excel как "1,55E + 12" или "1547421377050". Код показан ниже:

Private Sub cmdDDE_Click()
Dim ChNumber As Integer
Dim myShell As String

ChNumber = -1
myShell = frmEESDDE.txtApp.Text

On Error Resume Next

'Copy selected rows into clipboard
Range("B2:G1401").Select
Selection.Copy

Shell_R = Shell(myShell, 1)

If Shell_R <> "" Then
'Initiate DDE
ChNumber = Application.DDEInitiate(app:="ees", topic:="")

If ChNumber <> -1 Then
    'Open EES
    Application.DDEExecute ChannelNumber, "[Open C:\EES\Tablesolve.ees]"
    'Paste data
    Application.DDEExecute ChannelNumber, "[Paste Parametric 'Table 1' R1 C1]"
    'Solve parametrictable
    Application.DDEExecute ChannelNumber, "[SOLVETABLE 'TABLE 1' Rows=1..1400]"
    'Copy results
    Application.DDEExecute ChannelNumber, "[COPY ParametricTable 'Table 1' R1 C7:R1400 C14]"
    'Choose separators
    Application.DecimalSeparator = ","
    Application.ThousandsSeparator = "."
    Application.UseSystemSeparators = False
    'Paste results from EES into EXCEL
    Application.Paste Destination:=Worksheets("Sheet1").Range("H2:O1440")
    Application.UseSystemSeparators = True
    'Quit EES and Terminate DDE
    DDEExecute ChNumber, "QUIT"
    Application.DDETerminate ChNumber
Else
    MsgBox "Unable to initiate connection to EES", vbExclamation, "EES DDE"
End If

frmEESDDE.Hide

Else
    MsgBox "The application, " & myShell & ", was not found", vbExclamation, "EES DDE"
End If

PS = Как вы можете видеть, я попытался установить разделитель десятичных чисел на ",", как предложено в этой ссылке: Вставка десятичных чисел в разделителе excel/запятой и десятичной запятой но это тоже не сработало!

Я ценю вашу помощь!

+3
источник поделиться
3 ответа

Проблема решена! Я также разместил вопрос в португалоязычном сообществе stackoverflow и получил очень полезный ответ. С небольшими корректировками она решила мою проблему! Ссылка на решение на португальском языке следует:

https://pt.stackoverflow.com/questions/74860/vba-excel-n%C3%A3o-reconhece-v%C3%ADrgula-de-dados-externos

Но для тех, кто предпочел бы английскую версию, я попытаюсь обобщить, что было сделано, чтобы исправить код:

1- объявить переменные диапазона:

Dim interval As Range 'represent the cells in which info was pasted
Dim Cell As Range 'to allow cell format to be changed

2- после копирования результатов из вечной программы и перед вставкой:

Set interval = Worksheets("Sheet1").Range("H2:O1440") 'set interval to paste the results
interval.NumberFormat = "@" 'set format to text

3- после вставки:

interval.NumberFormat = "General" 'set format to general
For Each Cell In interval
    Cell.Value = FormatNumber(CDbl(Cell.Value), 2) 'set only 2 decimal places
    Cell.Value = CDbl(Cell.Value) 'set to double
Next

Остальная часть кода остается такой, как есть.

Особая благодарность Кантони, который помог с решением в версии pt.

0
источник

Вместо вставки с помощью application.paste попытайтесь вставить только значения. т.е.: вместо

Application.Paste Destination:=Worksheets("Sheet1").Range("H2:O1440")

Использование

Range("H2:O1440").PasteSpecial xlPasteValues

Если это не работает, проанализируйте вывод как строку.

0
источник

Вы также можете попробовать следующее:

Worksheets("Sheet1").Range("H2").PasteSpecial xlPasteValuesAndNumberFormats
0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос