我已经看过这个问题的类似答案,但无论我做什么,我都无法让他们做我需要的。
我每天都有一封电子邮件,其中有一个CSV文件,可以为前一天的销售团队提供通话统计信息。我需要的是将它们放入Excel中以提供当年的趋势和历史呼叫活动。如果没有VBA或宏,这是一个非常耗时的过程。
它给出的统计数据是呼叫次数和平均呼叫长度(具有任何重要性)我已经有了VBA来计算总出局数:
Dim Call_Number As Integer
Dim Call_Time As Date
Dim Call_Total As Date
Call_Number = .Cells(2, 6).Value
Call_Time = .Cells(2, 7).Value
Call_Total = Call_Number * Call_Time
.Cells(12, 7).Value = Call_Total
所以我需要的是为每个销售成员取3个单元格,并将它们移动到相对表格中的正确位置,这些表格按名称分隔。如果目标单元格已满,我还需要它进入右边的下一个单元格,所以我认为我需要在1月1日开始粘贴过程并继续向右移动直到找到空白单元格。有没有办法可以通过按钮或自动完成?
我有第一张用作数据导入表的工作表,我们只是将数据导入到csv中,并且由于它的标准格式,每天都会以正确的格式提供所有格式。
我到目前为止的代码。它没有错误,但没有做任何事情:
Sub Move_Data()
Dim Dean As Worksheet
Dim Chris As Worksheet
Dim Paul As Worksheet
Dim Nigel As Worksheet
Dim Calc As Worksheet
Dim Lastrow As Long
Dim J As Long
Dim i As Long
Set Dean = ThisWorkbook.Worksheets("DEAN 822")
Set Chris = ThisWorkbook.Worksheets("CHRIS 829")
Set Paul = ThisWorkbook.Worksheets("PAULP 830")
Set Nigel = ThisWorkbook.Worksheets("NIGEL 833")
Set RUSSELL = ThisWorkbook.Worksheets("RUSSELL 835")
Set Calc = ThisWorkbook.Worksheets("Calculation Sheet")
Lastrow = Range("C" & Dean.Columns.Count).End(xlToRight).Column
J = 2
For i = 0 To Lastrow
Set Rng = Dean.Range("C5").Offset(i, 0)
If Not (IsNull(Rng) Or IsEmpty(Rng)) Then
Calc.Cells(2, 4).Copy
Dean.Range("c" & J).PasteSpecial xlPasteValues
J = J + 1
End If
Next i
Application.CutCopyMode = False
End Sub
答案 0 :(得分:0)
而不是
Lastrow = Range("C" & Dean.Columns.Count).End(xlToRight).Column
我想你想要
Lastrow = Range("C" & Dean.Columns.Count).End(xlUp).Row
“我还需要......按钮或自动?”
LastCol = WshtName.Cells(CrntRow, Columns.Count).End(xlToLeft).Column
会将LastCol
设置为行CrntRow中最后使用的列。
J = 2
For i = 0 To Lastrow
Set Rng = Dean.Range("C5").Offset(i, 0)
If Not (IsNull(Rng) Or IsEmpty(Rng)) Then
Calc.Cells(2, 4).Copy
Dean.Range("c" & J).PasteSpecial xlPasteValues
J = J + 1
End If
Next i
Application.CutCopyMode = False
我不确定这段代码的用途。
它将Rng
设置为C5,C6,C7,C8,...至Cn,其中n为Lastrow + 5。例如,如果C5为空,则将C2复制到`Calc.Cells(2,4)。
您的意思是将C列从工作表Dean复制到工作表Calc的B列吗?
如果删除空单元格并不重要,那么这将更快更清晰:
Set Rng = Dean.Range(.Cells(5 ,"C"), .Cells(Lastrow ,"C"))
Rng.Copy Destination:=Calc.Cells(2, 4)
回复评论的新信息
我无法从您的描述中看到您的源数据或目标数据,因此无法提供任何具体建议。
欢迎使用Stack Overflow。我相信这是查找以前发布的信息的好地方,也是发布新问题的好地方,但您必须遵守网站规则。
顶部栏中央的右侧是“帮助”按钮。单击此处并阅读如何使用此站点。了解如何发布一个被归类为好问题的问题,并将得到快速有效的回答。
我相信你问题最大的三个问题是:
为避免要求太多,您必须将您的要求分成小步骤。以下是我尝试根据您对所寻求内容的猜测来确定必要的小步骤。
包含员工详细信息的CSV文件作为每日电子邮件的附件到达。您是手动保存这些附件吗?用于保存附件的Outlook VBA宏不难编写。我建议您稍后再保留此选项,但如果您在“[Outlook-vba]保存附件”中搜索Stack Overflow,您将找到相关代码。
以上显示了我如何搜索Stack Overflow。我从语言的标签开始,并用一些关键词或关键词跟着它。有时我需要花一些时间来获得正确的搜索词,但我很少找到有趣的东西
如何将CSV导入Excel?你是手动做的吗?有许多可能的VBA方法。尝试搜索“[excel-vba] xxxx”,其中xxxx描述了您的首选方法。
我假设CSV文件的结构非常简单,并且在各行中查找信息没有困难。您似乎知道找到最后一行的最简单的技术,因此您应该没有任何困难来创建一个向下行的循环。
如何将CSV文件中的工作人员姓名与其工作表的名称相关联?在您的问题中,您有工作表名称,如“DEAN 822”,“CHRIS 829”和“PAULP 830”。这些是CSV文件中使用的名称吗?当新员工加入时会发生什么?我怀疑这种情况经常发生,但你不想在它发生时修改你的宏。
我不明白您要求将新数据添加到任何现有数据的右侧。每天将有三个值,每年约200个工作日,可提供600列。对我来说,看到一个尴尬的安排。我原本以为每天一行会更方便。
你将如何运行宏?你提到一个按钮或自动。我不喜欢按钮,因为我发现工具栏已经足够杂乱了。我更喜欢使用快捷键,例如 Ctrl + q 。我很少每个这种类型的工作簿都有一个以上的宏,所以对我来说效果很好。通过自动,我假设您的意思是宏将在工作簿打开时自动运行。我会从快捷键开始,但是当你准备好时,查看“事件”和“事件例程”。您将找到有关如何在工作簿打开时自动启动宏的说明。
我希望以上内容有所帮助。