VBA导入数据

时间:2015-06-17 21:59:02

标签: excel vba excel-vba

我遇到了问题,我认为这很复杂。它是关于从另一个Excel文件导入数据/信息,所需的数据/信息是两张纸。

代码工作但不是方式应该是它似乎没有导入数据,下面它会解释我们不能做的事情,(“我和我的朋友在这个项目中工作是我们公司的需求对这个类别的VBA几乎一无所知,我们只是在研究这方面的信息,但总是卡住“)。

我们需要从文件中提取(链接在描述中),并且每周都会创建文件(semana),所以它需要每周提取最新的文件。

下面是Excel文件,负责提取数据,出于安全原因我们删除了大部分信息并更改了名称。

Workbook with the Macro - Used for importing工作表是数字2,也称为Dev.Pag,宏与同一文件中的“IMPORT DATA”按钮相关联。

Source Workbook - Contains the data这是从名称中获取值(导出)的地方,一些数据被删除,因为它可能会损害公司。

如果我可以编辑或更改任何内容,请告诉我。提前感谢您的回复。

还会在下面发布代码:

Option Explicit
Sub ImportData()

    Application.ScreenUpdating = False
    Dim Path As String, Lstrw As Long
    Dim SourceWb As Workbook
    Dim TargetWb As Workbook

    'Change this to your company workbook path
    Path = "C:\Users\DZPH8SH\Desktop\Status 496 800 semana 12 2015.xls"    
    Workbooks.Open (Path)

    'Change "Source" to the name of your company workbook
    Set SourceWb = Workbooks("Status 496 800 semana 12 2015.xls")        

    'Part that needs some adjustments in down below
    'This part is working good but probably some error in the data
    'transferance may be intrefering with the integridty

    'change the file address
    Set TargetWb = Workbooks("Master_Atual_2015.xlsm") 
    Lstrw = SourceWb.Sheets(1).Cells.Find(What:="*", SearchOrder:=xlRows, _
            SearchDirection:=xlPrevious, LookIn:=xlValues).Row
    With SourceWb.Sheets(1)
        .Application.Union(.Range("D2:D" & Lstrw), .Range("F2:F" & _
            Lstrw), .Range("I2:I" & Lstrw), .Range("M2:M" & Lstrw)).Copy _
            Destination:=TargetWb.Sheets(1).Range("A3")
    End With

    SourceWb.Close savechanges:=False
    Application.ScreenUpdating = True

End Sub

1 个答案:

答案 0 :(得分:1)

由于以下几个原因,很难理解您的代码:

  • 您只需按索引引用工作表。因此很难找到它们。更好地通过名称引用它们
  • 您只能通过地址引用范围,最好定义命名范围

使其更具可读性/可调试性的另一点是,将联合设置为自己的范围对象,以便能够观看内容并确保这是您想要的内容。

With SourceWb.Sheets(1)
    Set objTargetRange = .Application.Union(.Range("D2:D" & Lstrw), .Range("F2:F" & Lstrw), .Range("I2:I" & Lstrw), .Range("M2:M" & Lstrw))
    objTargetRange.Copy Destination:=TargetWb.Sheets(1).Range("A3")
End With

当打印出objTargetRange的地址时,它看起来像这样(你可以通过简单地按ctrl + g并写入?objTargetRange.Address来实现)

$ d $ 2:$ d $ 9; $ F $ 2:$ F $ 9; $ I $ 2:$ I $ 9; $ M $ 2:$ M $ 9

所以你选择了四列,每列有8个单元格。将此添加到A3时,它将并排添加,它没有任何偏移。

所以单元格A3-D10将被您的数据覆盖,代码正常。这样做是不可见的,因为比较状态之前和状态之后非常复杂。您可以通过

显示实际发生的更改
  • 从表格中临时删除您的实际数据
  • 临时添加一些空行