2015-03-02 1 views
0

J'utilise Office 2013 et SQLServer 2008 R2. J'ai un proc VBA Excel qui insère une liste de commissions pour les ventes dans une base de données. L'une des colonnes est SalesRepID, qui doit clairement être valide. Quand il a été écrit, nous avions une équipe de vente plutôt statique, mais nous avons depuis acquis deux autres sociétés qui font un travail moins spécialisé, donc il y a beaucoup de changements dans la force de vente maintenant. Les méthodes actuelles ont une liste de repères de vente et de noms dans la plage nommée triée, qui est ensuite utilisée comme critère de validation: l'utilisateur reçoit une liste de représentants dans la liste déroulante dans Excel et quand ils en sélectionnent un, il utilise VLookup pour insérer le SalesRepID dans une cellule cachée. Ceci est ensuite utilisé dans l'opération d'insertion.Excel - Actualiser et valider des données à partir de SQL (VBA)

Ce que je veux faire maintenant est de donner aux utilisateurs un bouton d'actualisation (et idéalement exécuter l'actualisation à l'ouverture). Certains des billeurs travaillent à la maison le week-end, donc cela doit pouvoir fonctionner hors ligne (évidemment, si un nouveau représentant est ajouté et qu'ils ne sont pas rafraîchis, ils ne verront pas le nouveau représentant).

Je ne veux pas avoir à définir quoi que ce soit comme sources ODBC sur la machine

physique d'un utilisateur que je suis en train de trouver le moyen de résoudre ce problème. Une façon consiste à ajouter un bouton d'actualisation qui va exécuter une requête, insérer la liste actuelle des commerciaux et mettre à jour la plage (ou utiliser une plage dynamique) pour être le numéro actuel des enregistrements renvoyés. (Je suppose que je peux mettre à jour une adresse de plage nommée, ou qu'une plage dynamique mettra à jour si les données sont insérées à partir d'une requête SQL)

Par exemple:

Gamme initiale

1 Tom 
2 Dick 
3 Harry 

Plage SalesReps = A1: B3

Hits utilisateur Actualiser: supprime le contenu des anciennes plages. insérer une nouvelle liste

Nouvelle gamme

1 Tom 
2 Dick 
3 Harry 
4 Fred 

salesreps Plage = A1: B4

Quelqu'un peut-il penser à une meilleure façon de cela?

Cordialement

Mark

+0

Qu'avez-vous fait jusqu'à maintenant? –

Répondre

1

Essayez ceci pour votre dynamique

Dim LastRow as integer 
    LastRow = Sheets("yoursheet").Cells(Rows.Count, "A").End(xlUp).Row 

    Range("A1:B" & LastRow).name = "SalesReps" 

Le code fonctionne d'une manière légèrement unintuitive. Cells(Rows.Count, "A") trouve la toute dernière cellule de la feuille dans la colonne A (ligne 1048576 ou quelque chose).

End(xlUp).Row équivaut à appuyer sur ctrl + up depuis cette cellule et à renvoyer le numéro de ligne de la première information contenant la cellule.

+0

Merci beaucoup. J'ai bien travaillé, mais je ne suis pas sûr de comprendre pourquoi. Ma plage initiale est I6: J6. J'ai évidemment changé les références dans votre exemple pour correspondre à ma gamme, mais je ne suis pas sûr de xlUp. J'aurais pensé que partir de la première rangée et utiliser xlDown aurait été une solution. Est-ce que votre exemple commence à partir de la fin de la feuille entière et regarde à partir de là? J'essaie juste de comprendre. Merci Mark – mark1234