Как отображать буквы с французским акцентом: é и ему подобные?

Мой код делает:

  • Поиск в форме для проверенного имени (кнопка радио)
  • Найдите это имя в файле CSV и извлеките некоторые значения (имя, название, функцию и ссылку на изображения).
  • Вставьте эти значения в документ Word (для ссылочного значения или значения подписи)

Это работает для стандартных имен, таких как Джон Смит, но когда у меня есть специальные буквы в имени, такие как Франсуа Бене, это не так. Вместо é в документах появляется é.

Если имя содержит какие-либо другие специальные символы, оно также ничего не находит в 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

Есть ли какой-то параметр, который нужно добавить, чтобы иметь правильный формат для французских символов (é, à, è, ç и т. д.)?

CharacterSet=850 скорее всего не помогает... кодовая страница 863 работает лучше? Какая кодировка файла CSV, вы ее контролируете?
Mathieu Guindon 27.05.2019 16:35

Нет, на самом деле набор символов был попыткой с моей стороны. Раньше я не использовал этот параметр. Пробовал с 863, та же проблема. Но спасибо за попытку. Что вы подразумеваете под управлением кодировкой? Я только что сделал преобразование из excel в CSV со значением, разделенным запятыми. Nom,Fonction,DPT,Titre François,Cheffe du Service,Dépt Ressources humaines,M.

Jon Swiss 27.05.2019 16:38

CSV — это текстовый файл, текстовые файлы имеют кодировку. Если вы откроете его в Notepad++, он сможет определить кодировку (вероятно, UTF-8). ADODB.Stream может читать текст, закодированный с помощью UTF-8; это должно помочь.

Mathieu Guindon 27.05.2019 16:45

Да, я проверил с помощью Notepad++. Это действительно UTF-8. Работает ли Adodb.stream так же, как ADODB.Recordset... Я не очень хорошо разбираюсь в VBA...

Jon Swiss 27.05.2019 16:55

Связанный ответ показывает, как CSV-файл считывается в поток - это другой подход, без SQL-запроса.

Mathieu Guindon 27.05.2019 17:25

Я пытался понять код по ссылке. Честно говоря, я немного растерялся... Другая ссылка создает еще один CSV-файл на основе первого. Зачем мне это делать, если у меня уже есть CSV в UTF-8? Как мне найти нужное значение без какого-либо запроса?

Jon Swiss 28.05.2019 07:45

Когда я пробую код, у меня возникает проблема с типом «Dim ws As Worksheet». Это потому, что я в Word? А у вас нет рабочего листа?

Jon Swiss 28.05.2019 08:02

О, я полностью пропустил тег Word — действительно, Worksheet не будет определен, если вы не сошлетесь на библиотеку типов Excel. Но вам не нужен никакой рабочий лист, только код потока ado.

Mathieu Guindon 28.05.2019 13:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
460
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мне удалось сделать большую часть (спасибо, Матье Гуиндон).

Так что та часть, которая показывает отдел, название и имя со специальными символами, работает нормально (даже быстрее, чем предыдущая версия моего кода).

Я использовал 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 

Другие вопросы по теме