谁可以帮助初学者。我添加了两个截图,让我的故事更加清晰。
我的Excel工作表是两个标签。一个是'计算',另一个是'项目'。
我想知道的是如何在vba中编写以下内容:
在计算选项卡中,E列中有一个员工编号。我必须查看该编号是否也写在项目选项卡中。如果是这样,我需要知道计算选项卡的日期是否在项目选项卡中的开始和结束日期之内。如果是,则将该行的信息写入计算选项卡中的空列。
当员工在“项目”选项卡中处理多个作业时,会出现另一个问题。我想这里需要另外一个循环:
如果计算选项卡中的日期不属于项目选项卡中从开始到结束的时间段,那么是否有另一行具有相同的员工编号,并且可能属于该期间。
我希望我的故事清晰明白。我知道步骤应该是什么,而不是如何编程。我希望有人能够帮助我。
答案 0 :(得分:1)
由于您的屏幕截图似乎是Excel for Windows,因此请考虑使用Windows' JET / ACE引擎(.dll文件)因为您只需要使用WHERE
子句加入两个工作表以进行日期过滤。在这种方法中,您可以避免任何循环和使用数组/集合的需要。
要在下面集成,请添加一个名为 RESULTS 的新工作表,因为工作簿上的SQL查询是只读操作,不会更新现有数据。 LEFT JOIN
用于保存计算中的所有记录,而不管 Projects 中的匹配项,但匹配的数据将填充在空列中。 结果应在结构上复制计算。根据需要调整SELECT
,ON
和WHERE
子句中的列名称(因为我无法清楚地从屏幕截图中读取列名称)。最后,一个非常重要的项目:确保日期列格式化为日期类型。
Dim conn As Object, rst As Object
Dim strConnection As String, strSQL As String
Dim i As Integer
Set conn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
' OPEN DB CONNECTION
strConnection = "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _ '
& "DBQ=C:\Path\To\Workbook.xlsx;"
conn.Open strConnection
' OPEN QUERY RECRDSET
strSQL = "SELECT t1.*, t2.[Project] AS [Which Project], t2.[Customer] As [Which Customer]," _
& " t2.[Start], t2.[End planned], t2.[Hours per week]" _
& " FROM [Calculation$A$3:$D$1048576] t1" _
& " LEFT JOIN [Projects$A$3:$J$1048576] t2" _
& " ON t1.EmployeeNum = t2.EmployeeNum" _
& " WHERE t1.[Date] BETWEEN t2.Start AND t2.[End planned];"
rst.Open strSQL, conn
' COLUMNS
For i = 1 To rst.Fields.Count Worksheets("RESULTS").Cells(3, i) =
rst.Fields(i - 1).Name
Next i
' DATA ROWS
Worksheets("RESULTS").Range("A4").CopyFromRecordset rst
rst.Close
conn.Close
Set rst = Nothing
Set conn = Nothing
答案 1 :(得分:0)
告诉我们你到目前为止做了什么会很棒。我认为初学者最简单的方法就是使用两个循环。一个用于计算,一个用于项目选项卡。
然后您就可以开始开发您的功能了。为每个工作表使用“行计数器”并迭代行。这是一个伪代码示例:
Dim lRowCountCalc as Long
Dim lRowCountPrj as Long
lRowCountCalc = 1
lRowCountPrj = 1
do
do
If Table2.Range("A" & lRowCountPrj).Value = Table1.Range("E" & lRowCountPrj).Value Then
If ... dates are equal
'Do some stuff
End if
End If
lRowCountPrj = lRowCountPrj +1
Loop Until lRowCountPrj = 5000 Or Table2.Range("A" & lRowCountPrj).text = ""
lRowCountCalc = lRowCountCalc +1
Loop Until lRowCountCalc = 5000 Or Table1.Range("A" & lRowCountCalc).text = ""
如果项目中当前行中的编号相同,只需检查计算中的每个员工编号。如果是,请进行检查并填写所需信息。如果有多个项目,您也会发现它,因为将检查所有行。
但要小心。这非常昂贵,因为此代码会针对计算中所有行的项目中的每一行进行迭代。但是从一开始我就会这样做。