Как переформатировать все поля даты Word Form с m / d / yyyy на yyyy-mm-dd с использованием VBA? - PullRequest
0 голосов
/ 17 апреля 2020

Я работаю над пользовательским сценарием VBA, который динамически собирает введенные пользователем данные формы и вставляет их в базу данных MySQL. Моя проблема в том, чтобы преобразовать данные поля формы в скрипт SQL, я должен использовать строковые функции; таким образом, все мои данные, включая даты, вставляются в виде текста. Мне нужно преобразовать все даты, которые собирает форма, из формата м / д / гггг в формат гггг-мм-дд для моей базы данных MySQL, чтобы вывести схему и загрузить данные о дате в БД без ошибок. Мне нужно сделать это динамически, то есть скрипт должен работать независимо от того, сколько полей даты собрано. У меня есть:

Private Sub Submit_Button()

Dim doc as Document
Dim control As ContentControl
Dim FormDateField As Date
Dim ReportNumber As String
Dim myValues As String
Dim myFields As String
Dim conn As ADODB.Connection
Dim strSQL As String

Set doc = Application.ActiveDocument
Set conn = New ADODB.Connection
conn.open "DSN=ABCD"

For Each control In doc.ContentControls
  Skip = False
  If Left(control.Range.Text, 5) = "Click" Or Left(control.Range.Text, 6) = "Choose" Then
    Skip = True
  Else:
    myFields = myFields & control.Tag
    myValues = myValues & "'" & control.Range.Text & "'"
  End If

  If Not Skip Then
    myFields = myFields & ", "
    myValues = myValues & ", "
  End If

  Next

myFields = Left(myFields, Len(myFields) - 2)
myValues = Left(myValues, Len(myValues) - 2)

strSQL = "INSERT INTO TABLE_1 ("
strSQL = strSQL & myFields
strSQL = strSQL & ") VALUES (" & myValues
strSQL = strSQL & ")"

conn.Execute strSQL
MsgBox "Form data saved to database!"
conn.Close

End Sub

Однако моя программа падает, потому что она пытается вставить строку в поле даты (фактическая конечная форма будет иметь много полей даты.) Я подумала, если я изменю формат даты в MySQL формате, это может быть в состоянии вывести схему? Я попытался добавить

If IsDate(control.Range.Text) Then
  control.Range.Text = Format(control.Range.Text, "yyyy-mm-dd")
Else FoundOne = False
End If

, и я знаю, что в Excel вы можете сделать:

Application.FindFormat.NumberFormat = "m/d/yyyy"
Application.ReplaceFormat = "yyyy-mm-dd"

Есть предложения? Спасибо.

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

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

Private Sub Submit_Button()
Dim CCtrl As ContentControl, bSv As Boolean, DtFmt As String
Dim myFields As String, myValues As String, strSQL As String
With ActiveDocument
  bSv = .Saved
  For Each CCtrl In .ContentControls
    With CCtrl
      If .ShowingPlaceholderText = False Then
        Select Case .Type
          Case wdContentControlDate
            DtFmt = .DateDisplayFormat
            .DateDisplayFormat = "YYYY-MM-DD"
            myFields = myFields & .Tag & ", "
            myValues = myValues & "'" & .Range.Text & "', "
            .DateDisplayFormat = DtFmt
          Case wdContentControlRichText, wdContentControlText, wdContentControlDropdownList, wdContentControlComboBox
            myFields = myFields & .Tag & ", "
            myValues = myValues & "'" & .Range.Text & "', "
          Case Else
        End Select
      End If
    End With
  Next
  .Saved = bSv
End With
If myFields <> "" Then
  myFields = Left(myFields, Len(myFields) - 2)
  myValues = Left(myValues, Len(myValues) - 2)
  strSQL = "INSERT INTO TABLE_1 (" & myFields & ") VALUES (" & myValues & ")"
  Dim Conn As New ADODB.Connection
  With Conn
    .Open "DSN=ABCD": .Execute strSQL: .Close
  End With
  Set Conn = Nothing
  MsgBox "Form data saved to database", vbInformation
Else
  MsgBox "No form data found", vbExclamation
End If
End Sub
1 голос
/ 17 апреля 2020

Как вы заметили, в Word нет Application.FindFormat или Application.ReplaceFormat, но если вы знаете, что формат m / d / y, вы должны сделать это:

myValues = myValues & "'" & ymd(control.Range.Text) & "'"


Function ymd(s as String) As String
Dim v As Variant
v = VBA.split(s, "/")
ymd = Right("0000" & v(2),4) & "-" & Right("00" & v(0),2) & "-" & Right("00" & v(1),2)
End Function

Все остальное (например, способ добавления запятых в список дат) выглядит хорошо, но я не проверял.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...