Chargement de fichier csv dans un VBA tableau plutôt que d'une Feuille Excel
Je suis actuellement en mesure d'entrer dans le fichier csv des données dans Excel VBA en téléchargeant les données via le code ci-dessous puis de la manipulation de la table, sûrement pas la meilleure façon que je ne m'intéresse qu'à une partie des données et la suppression de la fiche après l'utilisation de la data:
Sub CSV_Import()
Dim ws As Worksheet, strFile As String
Set ws = ActiveSheet 'set to current worksheet name
strFile = Application.GetOpenFilename("Text Files (*.csv),*.csv", ,"Please select text file...")
With ws.QueryTables.Add(Connection:="TEXT;" & strFile, Destination:=ws.Range("A1"))
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.Refresh
End With
End Sub
Est-il possible de charger un fichier csv dans un de deux dimensions tableau de variant en VBA plutôt que de passer par l'utilisation d'une feuille de calcul excel?
OriginalL'auteur The_Barman | 2012-09-04
Vous devez vous connecter pour publier un commentaire.
Bon, on dirait que vous avez besoin de deux choses: le flux de données à partir du fichier, et de remplir un tableau 2d.
J'ai un "Join2d" et un " Split2d fonction de traîner (je me souviens de les afficher dans une autre réponse sur StackOverflow il y a un moment). Regardez les commentaires dans le code, il y a des choses que vous pourriez avoir besoin de savoir à propos de efficace de la chaîne de manutention si vous êtes le traitement de gros fichiers.
Cependant, ce n'est pas une fonction compliquée à utiliser: il suffit de coller le code, si vous êtes pressé.
Streaming le fichier est simple, MAIS nous sommes de faire des hypothèses sur le format de fichier: sont les lignes dans le fichier délimité par Retour de Chariot caractères, ou le Retour Chariot et Saut de ligne-paire de caractères? Je suis en supposant que " CR " plutôt que CRLF, mais vous devez vérifier que.
Une autre hypothèse sur le format de données numériques apparaissent comme-est, et la chaîne de caractère ou de données seront encapsulés dans des guillemets. Cette devrait être vrai, mais n'est pas souvent... Et enlever les marques de devis ajoute beaucoup de traitement - beaucoup de l'allocation et la désallocation de chaînes que vous ne voulez vraiment pas être fait dans un grand tableau. J'ai coupé court évident de la cellule par cellule de recherche-remplacement, mais c'est toujours une question de gros fichiers.
De toute façon: voici le code source: attention aux sauts de lignes insérées par StackOverflow du contrôle de zone de texte:
L'exécution du code:
Notez que vous aurez besoin d'une référence à Microsoft Scripting Runtime (system32\scrrun32.dll)
De la diffusion d'un fichier csv.
Noter que je suis en supposant que votre fichier est dans le dossier temp:
C:\Documents and Settings[$nom d'utilisateur]\Local Settings\Temp
Vous aurez besoin d'utiliser le système de fichier de commandes pour copier le fichier dans un dossier local: il est toujours plus rapide que de travailler à travers le réseau.
La Split2d Fonction, ce qui crée un 2-dimensions VBA tableau à partir d'une chaîne de caractères; et Join2D, qui fait l'inverse:
De partager et de profiter.
Ne fonctionnera pas si les champs contiennent des retours à la ligne (ou un délimiteur de champ.
Torben est correct: 'ne fonctionnera pas si les champs contiennent des retours à la ligne (ou séparateur de champ" - si vous passer mon code une chaîne de caractères contenant les caractères de délimitation d'un fichier csv, il échoue. Votre prochaine question: comment ces caractères obtenir dans un fichier csv en premier lieu? Dans le cas où le fichier csv est correctement mis en forme, avec des chaînes entourées d'apostrophes, 'forbidden' caractères peuvent être codés... de Sorte que vous avez à faire "remplacer" sur les données entrantes, une seule chaîne à la fois.
Pour
ArrayFromCSVfile
, ne devrait pasarrData = Join2d(strTemp, RowDelimiter, FieldDelimiter)
effectivement êtrearrData = Split2d(strTemp, RowDelimiter, FieldDelimiter)
, c'est à direSplit2d
au lieu deJoin2d
?Merci @dashnick - fixe, et veuillez accepter mes excuses pour ne pas s'apercevoir de cette avant que j'ai posté le code.
OriginalL'auteur Nigel Heffernan
Oui lire un fichier texte.
Voir cet exemple
SUIVI
Comme je l'ai mentionné ci-dessous dans les commentaires, autant que je sache, il n'y a pas de moyen direct de remplissage d'un Tableau 2d à partir d'un fichier csv. Vous devrez utiliser le code que j'ai donné ci-dessus et de la diviser ensuite par ligne et, enfin, le remplissage d'un tableau 2D qui peut être lourd. Remplissage d'une colonne est facile, mais si vous voulez dire à partir de la Ligne 5 à Col 7 Données, puis il devient lourd, vous aurez pour vérifier si il y a suffisamment de colonnes/lignes de données. Voici un exemple de base pour obtenir le Col B dans un Tableau 2D.
NOTE: je n'ai pas fait toute erreur de manipulation. Je suis sûr que vous pouvez prendre soin de cela.
Disons que notre Fichier CSV regarde aime cela.
Lorsque vous exécutez ce code
Vous obtiendrez la sortie, comme illustré ci-dessous
BTW, je suis curieux que, depuis que vous faites cela dans Excel, pourquoi ne pas utiliser intégré
Workbooks.Open
ouQueryTables
méthode, puis lire les range dans un tableau 2D? Ce serait beaucoup plus simple...Pas de. Cela vous donnera un Unique Dimensions de la Matrice. Où chaque ligne sera stocké dans le tableau séparément. Vous pouvez diviser chaque ligne de la matrice à l'aide "," comme un delim, qui va encore vous donner un tableau.
donc gérer chaque ligne avec une séparation par ligne? Cela peut prendre plus de temps que la méthode d'origine. Est-il possible de charger directement dans les 2 dimensions tableau?
Non pas que je suis au courant de...
Voir la prochaine réponse: il y a une assez moyen rapide de remplissage d'un tableau 2d à partir d'un flux de texte contenant des séparateurs et des séparateurs de lignes... Et un fichier csv est exactement ce que
OriginalL'auteur Siddharth Rout
OK, après recherche dans ce, la solution que j'ai arived à l'est d'utiliser ADODB (il faut faire référence à des Objets de Données ActiveX, il charge le fichier csv dans un tableau sans le vélo, les colonnes et les lignes. Exige que les données soient en bon état.
OriginalL'auteur The_Barman
Alternativement, vous pouvez utiliser un code comme celui-ci, après avoir lu chaque ligne du fichier csv dans une chaîne de caractères que vous passez à csvline. Vous avez besoin d'un tableau R() comme Chaîne de caractères à recevoir les valeurs des colonnes. Ce tableau doit être Redim-ed (0) avant chaque appel à CSVtoArray
Dans ce cas, vous devez être sûr que vous
Redim (0)
le tableau qui va contenir les valeurs de colonne avant chaque appel à la routine, ou vous aurez un débordement de la mémoire sur vos mains. Notez que ce code ne charge que d'une ligne à la fois dans la réception de la matrice.OriginalL'auteur agcala