Sub Button1Click()
Dim temp As Worksheet
Dim rng As Range
Dim rng2 As Range
Dim Cancel As Boolean
Cancel = False
Set temp = ThisWorkbook.Worksheets("Input")
Dim tempAct As String
Dim tempCC As String
Dim tempRan As String
Dim Lastrow As Long
tempAct = Range("B1").Value
tempCC = Range("B2").Value
tempRan = Range("B3").Value
Set TEMP_TEMPLATE = ThisWorkbook.Worksheets("Database")
Set rng = temp.Range("B1:B3")
For Each cell In rng
If IsEmpty(cell) Then
MsgBox ("Blank Input!")
Cancel = True
Exit For
End If
Next
If Cancel = False Then
ThisWorkbook.Worksheets("Database").Range("C1").Value = tempAct
ThisWorkbook.Worksheets("Database").Range("C2").Value = tempCC
ThisWorkbook.Worksheets("Database").Range("C3").Value = tempRan
End If
End Sub
此帖正在继续我的上一篇文章。由jmstoker修复的错误 这次我想显示的结果不是C1,C2,C3 但是让我们说A1,B1,C1, 每次用户再次输入时,将连续显示A2,B2,C2 - A3,B3,C3等 有没有想过要替换这个?
ThisWorkbook.Worksheets("Database").Range("C1").Value = tempAct
答案 0 :(得分:0)
经过测试和运行的动态解决方案,只需最少的读/写事务: 将其复制粘贴到工作簿中并使用它。
此代码基本上是创建一个全局对象,其中包含要在数据库表中显示的值。 打开工作簿时,对象将被初始化;以前的值从数据库表加载到内存中,并在工作簿的生命周期内保留在内存中。不幸的是,一旦关闭工作簿,VBA就无法记住全局对象,这就是您被迫从工作表中读取数据的原因。因此,您需要在关闭工作簿之前保存工作簿,否则您的数据将丢失(如果没有此解决方案,那当然也是如此)。
每次要向“数据库”添加新行时,对象的行计数器都会更新,然后只需一次写入事务就会将更新的数组打印到工作表上。
此代码只是您可以用来玩的原型。 您会发现此逻辑适用于许多情况。 好处是,当您有新要求时,您可以非常轻松地自定义代码,未来的开发人员可能会对此表示感谢。
修改强> 这是许多Excel VBA开发人员挣扎的典型问题,找到更新静态工作表的解决方案。请注意,如果您选择静态解决方案,则在插入新列或空行乱码时可能会出现错误。 Excel的最佳解决方案是连接到Access数据库,这是一件非常非常容易的事情。只需几行代码,您就可以存储所需的任何数据。如果您计划存储更多数据,请务必考虑此选项。
1)本工作簿模块
Option Explicit
Private Sub Workbook_Open()
Call get_database
End Sub
2)常规VBA模块:“m_database”
Option Explicit
Global cDatabase As New c_database
Sub Upload_to_db()
cDatabase.setRow
cDatabase.TempAct = ThisWorkbook.Sheets(1).Range("a1").Value
cDatabase.TempCc = ThisWorkbook.Sheets(1).Range("a2").Value
cDatabase.TempRan = ThisWorkbook.Sheets(1).Range("a3").Value
cDatabase.write_to_database
End Sub
Function get_database()
cDatabase.set_array
End Function
3)类模块:c_database
Option Explicit
Private pTempAct As String
Private pTempCc As String
Private pTempRan As String
Private array_database() As Variant
Private pMax_row As Long
Private pRow As Long
Const tempAct_col = 1
Const tempCc_col = 2
Const tempRan_col = 3
Const nr_of_cols = 3
Private Sub Class_Initialize()
pMax_row = 1000000
ReDim array_database(1 To pMax_row, 1 To nr_of_cols)
End Sub
Public Property Let TempAct(sValue As String)
pTempAct = sValue
array_database(pRow, tempAct_col) = pTempAct
End Property
Public Property Let TempCc(sValue As String)
pTempCc = sValue
array_database(pRow, tempCc_col) = pTempCc
End Property
Public Property Let TempRan(sValue As String)
pTempRan = sValue
array_database(pRow, tempRan_col) = pTempRan
End Property
Public Function setRow()
pRow = pRow + 1
End Function
Public Function write_to_database()
Dim lNr_Rows As Long
Dim iNr_Cols As Integer
Dim oRange As Excel.Range
ThisWorkbook.Sheets("database").Cells.Clear
lNr_Rows = pRow
iNr_Cols = nr_of_cols
ThisWorkbook.Sheets("database").Activate
Set oRange = ThisWorkbook.Sheets("database").Range(Cells(1, 1), Cells(lNr_Rows, iNr_Cols))
oRange = array_database
End Function
Public Function set_array()
Dim oRange As Excel.Range
Dim iRange_rows As Integer
Dim lCnt As Long
Set oRange = ThisWorkbook.Sheets("database").UsedRange
iRange_rows = oRange.Rows.Count
For lCnt = 1 To iRange_rows
array_database(lCnt, tempAct_col) = oRange.Cells(lCnt, tempAct_col)
array_database(lCnt, tempCc_col) = oRange.Cells(lCnt, tempCc_col)
array_database(lCnt, tempRan_col) = oRange.Cells(lCnt, tempRan_col)
Next lCnt
pRow = oRange.Rows.Count
End Function