在更改Excel文件之前,通过ADO读取一个值

几个星期前,我学到了如何通过ADO更新Excel文件。 当时的价值在改变之前已经给出了。 现在,我想添加读取当前值在同一个单元格中的过程,并将其值更改为一个variables之前更改! 目前的程序如下所示:

Public Sub ChangeNum() Dim con As ADODB.Connection, rec As ADODB.Recordset Dim sqlstr As String, datasource As String Set con = New ADODB.Connection: Set rec = New ADODB.Recordset datasource = "D:\DropBox\TraderShare\TraderNum.xlsx" Dim sconnect As String sconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & datasource & ";" & _ "Extended Properties=""Excel 12.0 Xml;HDR=YES"";" con.Open sconnect sqlstr = "UPDATE [Sheet1$] SET [Number] = """ & gsvDocNum & """ WHERE [ID] = """ & svNumRng & """" rec.Open sqlstr, con ', adOpenUnspecified, adLockUnspecified 'adLockOptimistic , adOpenStatic, adLockReadOnly con.Close Set rec = Nothing: Set con = Nothing End Sub 

gsvDocNum是在初始启动例程开始处声明的全局stringvariables,因此在将当前值读入variables后,UPDATE将把gsvDocNum + 1写入文件。 svNumRng是在主例程开始时声明的以下命名范围之一,即PNumSNumTNumINum ,并确定在前一阶段(如果是Purchase,SalesOrder,TradeOrder或Invoice)查找哪一个范围。

我对ADO和SQLstring不太熟悉,而且我无法find正确的SELECT语法来读取当前的单元格值,并在将其更改为UPDATE之前将其分配给一个variables。

感谢任何帮助!


OK,背景如下:我们有一个pipe理程序,我自己写在Excel vba中,用于注册购买,订单和发票等。它对我们的要求非常好,但有一个问题,保持订单号在用户之间同步! 我们有3个用户在本地使用该程序,每个用户都在注册订单等,但我们通过共享的DropBox文件夹共享序列号文件。 我有这样的想法,如果不打开Excel文件,使用ADO / SQL将比打开,更改和保存文件在Excel中快。 原因当然是最小化更新文件的时间,因此,在同步到云端Dropfox位置和其他用户计算机之前的延迟被最小化。 这是一个简单的2列Excel文件,TraderNum.xlsx:

身份证号
PNUM 16000
SNUM 16000
TNum 16132
INum 16173

几个星期前,我学会了如何在不使用ADO / SQL打开文件的情况下更改Excel中的某个数字(参见上文)。 但是,我发现不断更新的Excel链接到一个封闭的文件,因为在更改之前获取当前编号不能按预期工作。 因此,在使用上面的ADO / SQL过程进行更改之前,我还希望使用ADO / SQL在Excel过程中将特定的当前编号读取/分配给一个variables。 因此,在两个命令之间的某处,rec.Open sconnect和con.Close应该有一个类似于以下的SQLstring:sqlread =“SELECT”“”&DocNumOld&“”“= [Number] FROM [Sheet1 $] ] =“”“&svNumRng&”“”“,其中DocNumOldvariables被分配了来自所选IDvariablessvNumRng的当前编号。 然后,DocNumNewvariables被赋值,DocNumOldvariables的值为1,然后是sqlUpdate序列。 它应该看起来类似于以下内容:

 Public Sub ChangeNum() Dim con As ADODB.Connection, rec As ADODB.Recordset Dim sqlRead as String, sqlUpdate As String, datasource As String, sconnect As String Set con = New ADODB.Connection: Set rec = New ADODB.Recordset datasource = "D:\DropBox\TraderShare\TraderNum.xlsx" sconnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & datasource & ";" & _ "Extended Properties=""Excel 12.0 Xml;HDR=YES"";" con.Open sconnect sqlRead = "SELECT """ & DocNumOld & """ = [Number] FROM [Sheet1$] Where [ID] = """ & svNumRng & """" sqlUpdate = "UPDATE [Sheet1$] SET [Number] = """ & DocNumNew & """ WHERE [ID] = """ & svNumRng & """" rec.Open ???????, con ????? sqlRead DocNumNew = DocNumOld + 1 UNION ????? sqlUpdate con.Close Set rec = Nothing: Set con = Nothing 

结束小组

你能解决这个问题吗?

任何人都可以给我一个解决scheme,如何使用ADO / SQL也可以读取/分配一个特定的当前数字到一个Excel程序中的variables,然后再用ADO / SQL程序进行更改?

我担心我不明白你的问题,因为最终的评论对我没有意义。

要重申您的问题:您需要知道某个单元的价值,并能够将其馈送到您的代码中。

您可以使用SQL连接到工作表,您已经知道SELECT语句是什么,并且您可能已经知道如何运行它们。 幽默我。

 sqlRead = "SELECT * FROM [Sheet1$A12:F48]" Set rec = con.Execute(sqlRead) 

现在你有一个包含整个表的logging集rec 。 假设你想把整个表的每个值都放在你的直接窗口中:

 Do While Not rec.EOF For i = 0 To rec.Fields.Count - 1 Debug.Print rec.Fields(i).Name, rec.Fields(i).Value Next rec.MoveNext Loop 

不要忘记closures它,我build议使用第二个variables名作为更新语句的logging集的名称。

 rec.Close 

假如你知道这个单元格总是在你正在select的表的第3行第8列,你可能会:

  For j = 0 to myRowNum-1 'you have set myRowNum equal to 3 earlier' rec.MoveNext Next myOldCellValue = rec.Fields(myColNum-1).value 'you have set myColNum to 8 earlier' rec.Close 

现在,假设你不知道哪一行你会findmyOldCellValue ,但是你知道它会在具有唯一ID [ID] 1234的行的第四列中find,你可能会:

 sqlRead = "SELECT * FROM [Sheet1$A12:F48] Where [ID] = """ & myIDNum & """" 'you have set myIDNum to 1234 earlier Set rec = con.Execute(sqlRead) myOldCellValue = rec.Fields(myColNum-1).value 'you have set myColNum to 4 earlier' rec.Close 

假设你想更新每一行有这个价值(我不读你的,但为了完整),你可能会:

 sqlUpdate="UPDATE [Sheet1$] SET [Number] = """ & DocNumNew & """ WHERE [DocNum] = """ & myOldCellValue & """"