从一张纸上获取结果并将它们移动到许多其他纸张中

时间:2014-05-19 08:39:52

标签: excel vba excel-vba csv

我已经看过这个问题的类似答案,但无论我做什么,我都无法让他们做我需要的。

我每天都有一封电子邮件,其中有一个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

1 个答案:

答案 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 。我很少每个这种类型的工作簿都有一个以上的宏,所以对我来说效果很好。通过自动,我假设您的意思是宏将在工作簿打开时自动运行。我会从快捷键开始,但是当你准备好时,查看“事件”和“事件例程”。您将找到有关如何在工作簿打开时自动启动宏的说明。

我希望以上内容有所帮助。