Excel 如何将计算数据(每月平均数)从源工作簿传输到主工作簿?

Excel 如何将计算数据(每月平均数)从源工作簿传输到主工作簿?,excel,vba,Excel,Vba,我有一个主工作簿,带有文件浏览器用户表单和表1中的图表,以及表2中的图表数据 现在的想法是通过主工作簿中的文件浏览器搜索源工作簿,并将相关数据从源工作簿传输到主工作簿的表2 我需要的数据基本上是每月的平均值。我不知道如何将一个工作簿引用到另一个工作簿,因此源工作簿的计算数据将显示在我的主工作簿的表2中 总结: 主工作簿(工作簿1):正在显示基于 在工作簿2中的数据上 源工作簿(工作簿2):正在提供必要的数据 我基本上需要下面显示的“传输按钮”的vba代码 这是我目前掌握的代码: 浏览按钮

我有一个主工作簿,带有文件浏览器用户表单和表1中的图表,以及表2中的图表数据

现在的想法是通过主工作簿中的文件浏览器搜索源工作簿,并将相关数据从源工作簿传输到主工作簿的表2

我需要的数据基本上是每月的平均值。我不知道如何将一个工作簿引用到另一个工作簿,因此源工作簿的计算数据将显示在我的主工作簿的表2中

总结

  • 主工作簿(工作簿1):正在显示基于 在工作簿2中的数据上

  • 源工作簿(工作簿2):正在提供必要的数据

我基本上需要下面显示的“传输按钮”的vba代码

这是我目前掌握的代码:

浏览按钮

Private Sub CommandButton1_Click()
    Dim fNames As Variant
    With Me
        fNames = Application.GetOpenFilename("Excel File(s) (*.xls*),*.xls*", , , , True)
        If IsArray(fNames) Then .ListBox1.List = fNames
    End With
End Sub
Sub Button1_Click()

Dim K As Double, Kn As Integer

Dim L As Double, Ln As Integer

Dim G As Double, Gn As Integer

Dim i As Integer, lastRow As Integer



lastRow = Cells(Rows.Count, 1).End(xlUp).Row



For i = 1 To lastRow

Select Case Range("H" & i)

Case "01.February"

K = K + Range("A" & i)

Kn = Kn + 1

Case "01.March"

L = L + Range("A" & i)

Ln = Ln + 1

Case "01.April"

G = G + Range("A" & i)

Gn = Gn + 1

End Select

Next i



Range("K1").Value = "February 2019"

Range("K2").Value = K / Kn

Range("L1").Value = "March 2019"

Range("L2").Value = L / Ln


End Sub
每月平均工资计算

Private Sub CommandButton1_Click()
    Dim fNames As Variant
    With Me
        fNames = Application.GetOpenFilename("Excel File(s) (*.xls*),*.xls*", , , , True)
        If IsArray(fNames) Then .ListBox1.List = fNames
    End With
End Sub
Sub Button1_Click()

Dim K As Double, Kn As Integer

Dim L As Double, Ln As Integer

Dim G As Double, Gn As Integer

Dim i As Integer, lastRow As Integer



lastRow = Cells(Rows.Count, 1).End(xlUp).Row



For i = 1 To lastRow

Select Case Range("H" & i)

Case "01.February"

K = K + Range("A" & i)

Kn = Kn + 1

Case "01.March"

L = L + Range("A" & i)

Ln = Ln + 1

Case "01.April"

G = G + Range("A" & i)

Gn = Gn + 1

End Select

Next i



Range("K1").Value = "February 2019"

Range("K2").Value = K / Kn

Range("L1").Value = "March 2019"

Range("L2").Value = L / Ln


End Sub

由于您只选择一个文件,请将列表框更改为文本框

选项显式
私有子命令按钮1_单击()'选择文件
Dim fname作为变体
和我一起
fname=Application.GetOpenFilename(“Excel文件(*.xls*),*.xls*”,“选择文件”,False)
如果fname为“False”,则.TextBox1.Text=fname
以
端接头
私有子命令按钮2_Click()'更新平均值
施工年份=2019年
'开源工作簿
Dim fname作为字符串,wbSource作为工作簿,wsSource作为工作表
fname=Me.TextBox1.Text
如果Len(fname)=0,则
MsgBox“未选择文件”,vbCritical,“错误”
出口接头
如果结束
设置wbSource=Workbooks.Open(fname,False,True)'无链接更新,只读
将wsSource=wbSource.Sheets(“Sheet1”)更改为适合
将wb设置为工作簿,ws设置为工作表
设置wb=ThisWorkbook
设置ws=wb.Sheets(“表2”)'
'向下扫描源工作簿计算平均值
Dim iRow为整数,lastRow为整数
Dim sMth作为字符串,iMth作为整数
小计数(12)为整数,和(12)为整数
lastRow=wsSource.Cells(Rows.count,1).End(xlUp).Row
对于iRow=1到最后一行
If IsDate(wsSource.Cells(iRow,8))_
和IsNumeric(wsSource.Cells(iRow,1)),然后
iMth=月份(wsSource.Cells(iRow,8))'列H
sum(iMth)=sum(iMth)+wsSource.Cells(iRow,1)'Col A
计数(iMth)=计数(iMth)+1'
如果结束
下一个
'关闭源工作簿不保存
wbSource。关闭False
'用平均值更新表2
带ws.Range(“A3”)
对于iMth=1到12
.Offset(0,iMth-1)=月份(iMth)和年份
如果计数(iMth)>0,则
.偏移量(1,iMth-1)=总和(iMth)/计数(iMth)
.Offset(1,iMth-1).NumberFormat=“0.0”
如果结束
下一个
以
作为字符串的Dim msg
msg=iRow-1&“扫描到的行”&TextBox1.Text
MsgBox msg,vbInformation,“表2已更新”
端接头

您的屏幕截图显示了单元格B4中二月的平均值,但您的代码正在写入单元格K2。屏幕截图哪一个是正确的?很抱歉,B4是正确的。我忘记相应地更新我的代码了。谢谢你的反馈!代码与我的“简单”测试源工作簿一起工作。但是,当我用真实的数据表尝试时,我得到了错误消息“无法识别日期”。真正的数据表是巨大的,有超过10000行——老实说,相当混乱。所以我现在的问题是:如何确保代码能够识别每个日期格式?(2019年2月1日、2月1日、2月1日等)如何确保代码只考虑相应列中的相关数据类型,而忽略所有其他内容?列A=整数(十进制数)列K=日期格式。@PlutoX如果K是“真”日期,则您可以简单地用iMth=月(wsSource.Cells(iRow,8))替换case语句,但如果某些语句是文本,则它会变得更复杂,如果您指的是“01.02.2019”而不是“是”。我必须准确地替换代码的哪一部分?我不知道如何根据您的反馈调整案例陈述。您的意思是这样吗?案例“01.Jan”:iMth=month(wsSource.Cells(iRow,8))谢谢!代码似乎与日期格式兼容。我现在唯一的问题是,如果K&A列中有“其他”值,我会收到一条错误消息。如何确保代码忽略其他值以确保我没有收到错误消息?