【发布时间】:2020-10-20 01:04:48
【问题描述】:
我们每 3 个月为我们的工程师提供一次文件。 此 Excel 文件,从 Access 文件中提取数据并以 Excel 格式显示。
由于其中一些数据没有改变,我们不知道工程师是否没有查看它,或者值是否没有改变。我正在尝试实现的是某种“确认”按钮,因此我们知道显示的值实际上已确认。
我要做的是在我们的访问文件中输入一个额外的列,称为“确认”。 当我们在我们的 excel 文件中提取这些数据时,我试图找到一种方法将“确认字段”转换为命令按钮,因此每当提取数据时,每行都会显示一个命令按钮。每当单击按钮时,数据都会保存在我们的 Access 文件中,因此我们知道该行实际上已被确认。
也许还有其他一些更简单的方法可以做到这一点?
我目前有一些代码可以在 Access 中保存 excel 数据,但它不能以当前的形式工作:
Sub S_SaveDataToDB()
If ActiveSheet.Name = "Estimate" Then
ViKey = 1
Else
ViKey = 2
End If
For i = 1 To ActiveSheet.ListObjects("TB_ACC" & ViKey).ListRows.Count
VsData = "SET [BE] = '" & F_FilterData(ActiveSheet.Cells(7 + i, 17)) & "', [PO STATUS] = '" & F_FilterData(ActiveSheet.Cells(7 + i, 18)) & "', [REMARKS] = '" & F_FilterData(ActiveSheet.Cells(7 + i, 19)) & "', [LOGDATE] = '" & Now() & "', [LOGID] = '" & Environ("Username") & "' WHERE [PO item] = '" & ActiveSheet.Cells(7 + i, 9) & "'"
If Len(F_FilterData(ActiveSheet.Cells(7 + i, 16))) + Len(F_FilterData(ActiveSheet.Cells(7 + i, 17))) + Len(F_FilterData(ActiveSheet.Cells(7 + i, 18))) > 0 Then Call S_UpdateDataInDB(VsData)
Next i
MsgBox "Data has been saved"
和
Sub S_UpdateDataInDB(VsData)
Dim cnDB As New ADODB.Connection
VsDBPath = ThisWorkbook.Sheets("Settings").Range("B2").Value
VsTable = "KCD"
cnDB.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & VsDBPath & ";" & "Jet OLEDB:Engine Type=5;" & "Persist Security Info=False;"
cnDB.Execute ("UPDATE " & VsTable & " " & VsData)
cnDB.Close
结束子 这里的区别是: 我只想为该特定单元格保存文本(“数据已确认”)。 因此,如果要确认第 8 行的数据并单击“数据确认”。它应该只在访问中保存第 8 行的“数据确认”。
【问题讨论】:
-
excel文件有多少行?也许添加一个带有下拉列表的列,用户可以在其中选择“是”或“否”,然后最后将列的值加载到数据库中?
-
行数不固定。有一种添加行的可能性,因此可以添加他/她必须添加的行。正如您提到的那样添加一列是我认为的另一种好方法!不要认为可以在某些 excel 行上添加命令按钮,尤其是当行不固定时
-
可以动态添加命令按钮(也可以按行),但它们并不固定在某一行。因此,很难确定命令按钮所引用的行。
-
还想通了,对于可变数量的行,我需要可变数量的 cmd 按钮,而每个 cmd 按钮的引用是 1:1 与行将很好添加 x 数量x 行数的 cmd 按钮自动。因此,每当有人添加一行时,它也会自动为该行“创建”一个额外的 cmd 按钮。我会尽量按照你的方式做,应该也可以!
标签: excel vba commandbutton