Мой код делает:
Это работает для стандартных имен, таких как Джон Смит, но когда у меня есть специальные буквы в имени, такие как Франсуа Бене, это не так. Вместо é в документах появляется é.
Если имя содержит какие-либо другие специальные символы, оно также ничего не находит в CSV. Но для этого я мог найти обходной путь.
Пробовал использовать другой формат CSV, например UTF 8. Но в этом случае я получаю сообщение об ошибке 3265.
'Répertoire
directory = "W:\Tous\DigitRHTemp\"
FileName = "BaseSignatureTest.csv"
'Ouverture de la connexion CSV
Set rs = CreateObject("ADODB.Recordset")
strcon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " & directory & ";" _
& "Extended Properties = ""text;HDR=Yes;FMT=Delimited;CharacterSet=850"";"
strSQL = "SELECT * FROM " & FileName
rs.Open strSQL, strcon, 3, 3
rs.MoveFirst
'Passer au travers des colonnes
Do
'Mise en variable des valeurs
col1 = rs("Nom")
col2 = rs("Fonction")
col3 = rs("DPT")
col4 = rs("Titre")
col5 = rs("Signature")
rs.MoveNext
'Si une valeur a été trouvée et qu'elle corresponds, définition des valeurs
If col1 = RHREF Then
'***
'--- Populer les signets Signatures 1
'***
'Test si signet exist dans le document
If ActiveDocument.Bookmarks.Exists("RHRefInt") = True Then
'Si oui - Position sur le signet
Selection.GoTo What:=wdGoToBookmark, Name: = "RHRefInt"
'Insére le text
Selection.TypeText Text:=col4
End If
If ActiveDocument.Bookmarks.Exists("RHRefNom") = True Then
Selection.GoTo What:=wdGoToBookmark, Name: = "RHRefNom"
Selection.TypeText Text:=col1
End If
End If
Loop Until rs.EOF
Есть ли какой-то параметр, который нужно добавить, чтобы иметь правильный формат для французских символов (é, à, è, ç и т. д.)?
Нет, на самом деле набор символов был попыткой с моей стороны. Раньше я не использовал этот параметр. Пробовал с 863, та же проблема. Но спасибо за попытку. Что вы подразумеваете под управлением кодировкой? Я только что сделал преобразование из excel в CSV со значением, разделенным запятыми. Nom,Fonction,DPT,Titre François,Cheffe du Service,Dépt Ressources humaines,M.
CSV — это текстовый файл, текстовые файлы имеют кодировку. Если вы откроете его в Notepad++, он сможет определить кодировку (вероятно, UTF-8). ADODB.Stream может читать текст, закодированный с помощью UTF-8; это должно помочь.
Да, я проверил с помощью Notepad++. Это действительно UTF-8. Работает ли Adodb.stream так же, как ADODB.Recordset... Я не очень хорошо разбираюсь в VBA...
Связанный ответ показывает, как CSV-файл считывается в поток - это другой подход, без SQL-запроса.
Я пытался понять код по ссылке. Честно говоря, я немного растерялся... Другая ссылка создает еще один CSV-файл на основе первого. Зачем мне это делать, если у меня уже есть CSV в UTF-8? Как мне найти нужное значение без какого-либо запроса?
Когда я пробую код, у меня возникает проблема с типом «Dim ws As Worksheet». Это потому, что я в Word? А у вас нет рабочего листа?
О, я полностью пропустил тег Word — действительно, Worksheet
не будет определен, если вы не сошлетесь на библиотеку типов Excel. Но вам не нужен никакой рабочий лист, только код потока ado.
Мне удалось сделать большую часть (спасибо, Матье Гуиндон).
Так что та часть, которая показывает отдел, название и имя со специальными символами, работает нормально (даже быстрее, чем предыдущая версия моего кода).
Я использовал ADODB.Stream, как было предложено, и открыл CSV, заставив его использовать UTF-8.
'Définition de l'objet
Dim objStream, strData
'Création d'un objet ADODB Stream
Set objStream = CreateObject("ADODB.Stream")
'Définition format en Utf-8
objStream.Charset = "utf-8"
'Ouverture de l'objet
objStream.Open
'Load du fichier
objStream.LoadFromFile ("W:\Tous\DigitRHTemp\BaseSignatureTest.csv")
'Définition du ligne par ligne
objStream.LineSeparator = 10
'Ouvrir chaque ligne jusqu'à la dernière ligne du fichier
Do Until objStream.EOS
'Défintion du texte à lire (ligne complète)
strData = objStream.ReadText(-2)
'Définition pour la partie valeur par valeur - sépare la ligne en valeur
Dim LArray() As String
'Sépare la valeur en se basant sur la virgule ","
LArray = Split(strData, ",")
'Si une valeur a été trouvée et qu'elle corresponds, définition des valeurs
If LArray(0) = RHSignature1 Then
'***
'--- Populer les signets Signatures 1
'***
'Test si signet exist dans le document
If ActiveDocument.Bookmarks.Exists("RHSign1Nom") = True Then
'Si oui - Position sur le signet
Selection.GoTo What:=wdGoToBookmark, Name: = "RHSign1Nom"
'Insére le text
Selection.TypeText Text:=LArray(0)
End If
If ActiveDocument.Bookmarks.Exists("RHSign1DPT") = True Then
Selection.GoTo What:=wdGoToBookmark, Name: = "RHSign1DPT"
Selection.TypeText Text:=LArray(1)
End If
If ActiveDocument.Bookmarks.Exists("RHSign1Fonction") = True Then
Selection.GoTo What:=wdGoToBookmark, Name: = "RHSign1Fonction"
Selection.TypeText Text:=LArray(2)
End If
End If
'Fermeture de la boucle
Loop
'fermeture du objstream
objStream.Close
CharacterSet=850
скорее всего не помогает... кодовая страница 863 работает лучше? Какая кодировка файла CSV, вы ее контролируете?