Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA显示第1行的值,依此类推_Vba_Excel - Fatal编程技术网

VBA显示第1行的值,依此类推

VBA显示第1行的值,依此类推,vba,excel,Vba,Excel,这篇文章是我最后一篇文章的延续。由司托克修正的错误 这次我想显示结果,而不是C1、C2、C3 但是让我们假设A1,B1,C1, 并且每次用户再次输入时,会连续显示A2、B2、C2-A3、B3、C3等 有没有办法换掉这个 此工作簿。工作表(“数据库”).Range(“C1”).Value=tempAct经过测试和工作的动态解决方案,具有最低限度的读/写事务: 将其复制粘贴到工作簿中,然后进行操作 这段代码基本上是创建一个全局对象,其中包含要在数据库工作表中显示的值。 打开工作簿时,对象被初始化;以

这篇文章是我最后一篇文章的延续。由司托克修正的错误 这次我想显示结果,而不是C1、C2、C3 但是让我们假设A1,B1,C1, 并且每次用户再次输入时,会连续显示A2、B2、C2-A3、B3、C3等 有没有办法换掉这个


此工作簿。工作表(“数据库”).Range(“C1”).Value=tempAct
经过测试和工作的动态解决方案,具有最低限度的读/写事务: 将其复制粘贴到工作簿中,然后进行操作

这段代码基本上是创建一个全局对象,其中包含要在数据库工作表中显示的值。 打开工作簿时,对象被初始化;以前的值从数据库工作表加载到内存中,并在工作簿的生命周期内保留在内存中。不幸的是,一旦关闭工作簿,VBA就无法记住全局对象,这就是为什么您必须从工作表中读取数据的原因。因此,您需要在关闭工作簿或丢失数据之前保存工作簿(如果没有此解决方案,当然也会如此)

每次要向“数据库”添加新行时,对象的行计数器都会更新,然后更新后的数组在一次写入事务中打印到工作表上

这段代码只是一个原型,您可以使用它来玩。 你会发现这种逻辑在很多情况下都是适用的。 这样做的好处是,当您有新的需求时,您可以非常轻松地自定义代码,未来的开发人员可能会为此而感激

编辑 这是许多Excel VBA开发人员遇到的一个典型问题,他们正在寻找更新静态工作表的解决方案。请注意,如果选择静态解决方案,则在插入新列或空白行将事情搞糟时,可能会出现错误。 Excel的最佳解决方案是连接到Access数据库,这是一件非常简单的事情。只需几行代码,就可以存储所需的任何数据。如果你打算存储更多的数据,当然可以考虑这个选项。 1) 此工作簿模块

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
2) 常规VBA模块:“m_数据库”

3) 类模块:c_数据库

Option Explicit

Private Sub Workbook_Open()
    Call get_database
End Sub
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

好啊注意:在这种情况下,您可以使用UsedRange,条件是正确验证提交到数据库工作表的值。由于每次执行写入操作时都会清除工作表,因此工作表中的值不会随机浮动。您还可以使用一个函数来扩展该类,该函数还负责验证。
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