Использование Sendkeys и VBA для вставки специальных символов ASCII во внешнюю программу

#excel #vba #sendkeys

Вопрос:

Я унаследовал набор макросов Excel, которые берут информацию из электронной таблицы и используют клавиши отправки для вставки информации в наше программное обеспечение AP. Я отлаживал различные проблемы, в основном связанные со временем нажатия клавиш и последовательностью их ввода. Одна из проблем, для решения которой мне не удалось найти полное решение, заключается в преобразовании символов, таких как % и (), в формат, пригодный для вставки, для передачи в наше программное обеспечение AP. Я нашел в Интернете различные статьи, в которых объясняется использование функции CHR() или регулярного выражения. Я не смог внедрить ни один из этих ответов в свое приложение. Эти символы обычно влияют только на нашу строку описания.Текущий способ вставки описания проходит через следующие разделы.

Это фиксирует информацию о том, где находится информация описания, и выполняет очень простую очистку.

  JEDescription = (Trim$(Range(cellDescription).Value))
   JEDescription = Application.Substitute(JEDescription, "(", " ")
   JEDescription = Application.Substitute(JEDescription, ")", " ")
 

Это передается в наше «описание записи», которое определяет, какое из наших описаний используется, оно может быть либо построчным описанием, либо общим описанием для пакета.

 Private Sub write_Description(arrDetailJE() As DetailJE, i As Integer)
    If TF_JE_Line_Description = True Then
        SendKeys arrDetailJE(i).JE_Line_Description, True
        Sleep lngSleep
    Else
       SendKeys JEDescription, True
       Sleep lngSleep
    End If
    

End Sub
 

Мне нужен способ передать специальные значения, самое главное % и ( ) во внешнюю программу с помощью клавиш отправки. Я нашел UDF, который работает в теории, но не смог реализовать его в моем текущем макросе.

 Function CleanTrim(ByVal S As String, Optional ConvertNonBreakingSpace As Boolean = True) As String
  Dim X As Long, CodesToClean As Variant
  CodesToClean = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, _
                       21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 127, 129, 141, 143, 144, 157)
  If ConvertNonBreakingSpace Then S = Replace(S, Chr(160), " ")
  For X = LBound(CodesToClean) To UBound(CodesToClean)
    If InStr(S, Chr(CodesToClean(X))) Then S = Replace(S, Chr(CodesToClean(X)), "")
  Next
' ""amp; added to preserve leading 0's in text fields
  CleanTrim = ""amp;WorksheetFunction.Trim(S)
End Function
 

Что-то подобное, позволяющее макросу обнаруживать ключи, которые прерывали бы отправку ключей, и передавать их, является желаемым результатом.

Комментарии:

1. Почему бы вам не поместить свою информацию в разделочную доску с помощью VBA и не использовать клавиши отправки только для вставки (Ctrl V) в программное обеспечение AP? Таким образом, у вас нет никаких проблем со специальными символами?