обновить и удалить один набор записей доступа через Excel VBA - PullRequest
0 голосов
/ 02 августа 2010

У меня есть этот инструмент, где информация о сотрудниках должна быть обновлена.Я призываю данные MDB преуспеть в одном листе.Теперь я использую vlookup, чтобы посмотреть, что там есть, и изменить его, если необходимо.

Я попробовал некоторые уловки, но кое-что кажется неправильным .., пожалуйста, помогите.

Sub update()
Dim cn As Object
Dim rs As Object
Dim a As String
strFile = "D:\temp excel\EIM.mdb"
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile & ";"
Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")
cn.Open strCon
a = Sheet2.Range("D4")
strSQL = "SELECT * FROM EIM WHERE EIM.NBKID=" & a
rs.Open strSQL, cn

strSQL = "UPDATE EIM SET EIM.Person#=('" & Sheet2.Range("D5") & "')WHERE EIM.NBKID=('" & Sheet2.Range("D4")
cn.Execute strSQL
End Sub

В приведенном вышезакодируйте файл EIM имеет таблицу с именем EIM с полями NBKID и Person #.

Так что извините за неясное объяснение запроса, у меня есть этот инструмент, который позволяет людям обновлять там информацию.Я не могу использовать доступ, чтобы манипулировать им, так как не у всех есть доступ, и даже если он будет доступен, я не хочу предоставлять им доступ к основной базе данных.

У нас более 500 сотрудников, когда кто-то переходит из одной роли в другую или когда кто-то покидает организацию.Менеджер должен запросить отчет по иерархии, который требует времени.

Вместо этого я хочу, чтобы этот инструмент вел учет всех сотрудников, здесь nbkid - это не что иное, как системный идентификатор, а person # - это номер или идентификатор сотрудника.

У меня есть код дляобновите информацию, однако, если кому-то нужно отредактировать ее из-за какого-то изменения в их роли, чем мне нужен другой набор кода.

Делая это в Excel, легко управлять - без дополнительного обучения.

У меня есть эта кнопка, которая должна обновить изменения, внесенные в правила, обновленные в листе Excel.Я не хочу, чтобы он проверял, изменяется ли запись, я просто хочу, чтобы он использовал update.

Когда я запускаю приведенный выше код, я получаю сообщение об ошибке «Нет значения для одного или нескольких требуемых параметров».

Ответы [ 3 ]

0 голосов
/ 02 августа 2010

Вам не хватает пробела между скобкой и где:

strSQL = "UPDATE EIM SET EIM.Person#=('" & Sheet2.Range("D5") _
       & "') WHERE EIM.NBKID=('" & Sheet2.Range("D4")

Одиночные кавычки необходимы, если NBKID является текстовым полем:

WHERE EIM.NBKID=('" & Sheet2.Range("D4") & "'"

Или для числового поля:

WHERE EIM.NBKID=(" & Sheet2.Range("D4") 

Я сомневаюсь, что это поле даты, но если бы оно было, потребовались бы хеш (#) разделители.

0 голосов
/ 04 августа 2010

Просто для эффективности, я не уверен, почему вы вообще открыли набор записей.Строка cn.Execute сама по себе работает очень хорошо.

Я также написал бы функцию, которую вы могли бы вызывать, и передавал ей параметры в зависимости от того, что вы пытаетесь сделать.Если вы передали идентификатор, strFileName и strSQL, то у вас есть универсальная функция.

У меня есть предварительно запеченная строка SQL где-то в паре ключей "SELECT * from tblFoo WHERE tblFoo.ixFoo = {ключ}».Затем я получаю параметр и делаю Replace в strSQL, чтобы вставить ключ.

Sub Update(strFile as string, strKey As String, strPerson as string)
Dim cn As Object : Set cn = CreateObject("ADODB.Connection")
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile & ";"
cn.Open strCon
strSQL = "UPDATE EIM SET EIM.Person#="{person}" WHERE EIM.NBKID={key}"
strSQL = Replace(strSQL, {person}, strPerson, 1)
strSQL = Replace(strSQL, {key}, strKey, 1)
cn.Execute strSQL
End Sub

Если скорость кода больше, чем потребность в скорости выполнения (что я и собираю здесь), тогда этот подходустраняет путаницу с кавычками / двойными кавычками

Я бы отложил лист в книге, в котором были все операторы strSQL, если бы у вас их было несколько.Вы могли бы даже передать это и выполнить замену в Excel с гораздо более высокой собственной скоростью выполнения.

Теперь у вас есть функция, которую вы можете выбрать и использовать повторно.Если вы серьезно относитесь к использованию VBA, интенсивно используйте повторно.Это экономит так много времени.Задания VBA, как правило, оказывают большое давление на время выполнения.

Я предполагаю, что вы удалили перехват ошибок, чтобы избавить нас от необходимости читать его.

0 голосов
/ 02 августа 2010

Я согласен с тем, что нужно изменить данные в Excel, а не напрямую при доступе, однако я только что заметил, что ваш оператор SQL кажется немного неправильным. Попробуйте изменить

WHERE EIM.NBKID=('" & Sheet2.Range("D4")

до

WHERE EIM.NBKID=" & Sheet2.Range("D4")

Обратите внимание на удаление знака одинарной кавычки, поскольку исходное утверждение выглядело бы как

WHERE EIM.NBKID=('123456
...