Bonjour!
Je suis occupé à adapter des macros VBA en LibreOffice 4.1.5.3 (sous Windows 7 Home 64 bits) Basic et ça fonctionne... presque
Modif. : Version courte
1°)Quelle est la limite pour un TextBox ? J'ai pas réussi à trouver... Et si non voyez-vous une alternative pour afficher un long texte dans une Form?
EDIT:Après analyse, c'est la variable String qui semble limitée à 65 534 caractères... Ce que je trouve incroyable, c'est qu'à ce jour il m'a été impossible de trouver une confirmation de cette limite?! D'après ce que j'ai trouvé, une String est un type de données sur 64 bits... Heuu OK, mais normalement je devrais en avoir beaucoup beaucoup plus que 65 534 caractères !!!!
Non? Disons que les caractères sont codés sur 32 bits (ce que je crois), on a encore 4 294 967 296 caractères = 4 Gb de données, ce qui est la limite dans tous les langages modernes que je connais! Alors pourquoi ai-je une String vide après 65 534, ce qui au passage est très proche de 16 bits...
Re-EDIT: je me demande si ce n'est pas plutôt la MsgBox, ainsi que la TextBox, vu que j'ai aussi le problème dans une Form, qui seraient limitées à 65 534 caractères ?!
Au secours ???? Je suis perdu![]()
Voilà une Sub qui chez moi illustre le problème... Est-ce que quelqu'un peut me confirmer qu'il a aussi uneStringMsgBox vide à 65 535 caractères
Sub TestStringMax
Dim str As String
Dim sLigne As String
Dim i As Long
str= ""
sLigne = "abcdefghijklmnopqrstuvwxyz123456abcdefghijklmnopqrstuvwxyz1234" & Chr(10)
For i=1 to 1040
str = str & sLigne
Next
'65 520 caractères ===> OK
'On ajoute encore 14 caractères
str = str &"abcdefghijklmn"
'65 534 caractères ===> Limite OK
'Preuve:
MsgBox "Len(str) = " & Len(str)
MsgBox str
'On ajoute 1 caractère
str = str &"a"
'65 535 caractères ===> MsgBox VIDE ?!?!?!?
'Preuve:
MsgBox "Len(str) = " & Len(str)
MsgBox str
End Sub
2°) Après avoir testé toutes les méthodes trouvées sur le Net (sans succès évidement), comment copier via le bouton d'une Form, le contenu d'une TextBox sur cette même Form, le contenu de la TextBox étant déjà sélectionné (faudrait juste faire un copy du contenu ou simuler un Ctrl+C) ?
Code testé, par exemple :
J'ai essayé de l'adapter à mon cas, mais je n'ai pas trouvé comment adapter le "document = ThisComponent.CurrentController.Frame" pour "instancier" le contenu de ma TextBox (TBmessage) d'une Form (UFmessage instancier en Dialog2)rem define variables
dim document as object
dim dispatcher as object
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:Open", "", 0, Array())
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:SelectAll", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:CloseWin", "", 0, Array())
MsgBox "The data was copied to the clipboard"
-----------------------------------------------------------------------------------------------------------------------
Modif: Version plus longue
Le but des macros est de:
- Importer un fichier *.csv => OK
- Supprimer des colonnes au choix en fonction d'une boîte de dialogue de sélection => OK
- Ajouter des données calculées en fonction des valeurs importée => OK
- Ajouter des correspondances entre la feuille contenant le fichier *.csv importé et une feuille "Liste" contenant des valeurs à faire correspondre => OK
Après tout ça on peut:
- Afficher une boîte de dialogue contenant 2 textbox et 2 boutons, les textbox contiennent un message pour Forum en BBCode pré-formaté avec les données venant d'une feuille contenant les données importées d'un fichier *.csv... Et pour chaque TextBox, un bouton pour sélectionner tout le contenu et le mettre dans le presse-papier...
C'est là que ça coince...
1°) Je crois que en fonction de la taille des données à formater en message[S] (je met ça dans une variable String et ça passe sans problème) quand je veux le mettre dans la TextBox... String ça ne fonctionne pas si il y a trop de données... Enfin c'est ce que je crois, car le résultat est une TextBox vierge et il n'y a pas de message d'erreur! Note ça bloque Par exemple avec une string de 71325 caractères... Avec 65 535 caractères ça passe sans problème. A 65 535 caractères c'est vide...
2°) Après des tas et des tas d'essai divers et varier et pas mal de recherche, impossible de trouver comment copier dans le presse-papier le contenu d'une textbox... J'ai réussi à trouver pour tout sélectionner, il me manque plus qu'une façon de copier ces données...
Je met évidement à disposition un fichier LibreOffice avec des données importées pour tester et toutes les macros... Dans ce fichier il y une feuille "Exemple Grenousse" qui semble avoir trop de données pour le mettre enTextBoxString (???) et une feuille "Import_CSV" qui est un exemple beaucoup plus léger et qui fonctionne.
Les macros dans Module1 sont Import_CSV (importation d'un fichier *.csv), mForum (lancer la boîte de dialogue avec le contenu pré-formaté en message BBCode) et UpdateTSV (ça fait juste une mise à jour et tout fonctionne dans cette macro). Les fonctions et procédures secondaires sont dans > Library1 > Module1.
C'est donc dans mForum, UFmessage (la boîte de dialogue) et les boutons BTpp et BTppMP (sub déclenchées pour les boutons qui se trouve dans la Library1 > Module1) que le problème se pose...
Masuda_TSV_Macro_LibreOffice_4_v01.ods
Je met aussi 2 fichiers *.csv d'exemple, un gros et un petit:
Plus gros fichier Grenousse_02.csv
Petit fichier Pitrouille_2.csv
Voilà... Et en générale je me suis toujours débrouillé seul... Mais là je suis coincé, c'est bien plus difficile de trouver des réponses pour LibreOffice Basic que pour du VBA
Remarque: si il y a une personne qui a un peu de temps pour regarder mon code de Import_csv, histoire de me donner 2 ou 3 conseilles pour améliorer la rapidité, je suis preneur car c'est beaucoup beaucoup plus lent qu'avec Excel 2010
D'avance un très grand merci!
Partager