【问题标题】:Having issues working with multiple woorkbooks using vba使用 vba 处理多个工作簿时遇到问题
【发布时间】:2020-11-16 18:55:53
【问题描述】:

我是编码新手,在这个领域几乎没有经验,我正在尝试在 Excel 上使用 VB 学习一些东西。

所以,我试图在 XML 中捕获一些单词并将它们写入新工作簿,但我不知道为什么,当我调用新工作簿并尝试对其进行编辑时,它会将值写入以前的工作簿,这是不应该发生的。

Sub loadXML()

Dim vFolder As String, vFile As String, vFileName As String
Dim vLineFile As Integer, vLineTAG As Integer, vLineResource As Integer
Dim vRange As String, vNode As String, vRange2 As String
Dim vWindowMain As String, vWindowFile As String, vWindowXML As String, vXMLSheetName As String
Dim XDoc As Object
Dim myNodes As IXMLDOMNodeList, myChildNodes As IXMLDOMNodeList
Dim myElement As IXMLDOMElement
Dim myNode As IXMLDOMNode, myChildNode As IXMLDOMNode
Dim nNode As Integer
Dim nChildNode As Integer
    
'principal
vWindowMain = ActiveWorkbook.Name

'planilha resource
Sheets("Plan1").Select
vRange = "A1"
vXMLSheetName = Range(vRange).Value + "Orionv5.xlsx"
Workbooks.Open vXMLSheetName, UpdateLinks:=False
vWindowXML = ActiveWorkbook.Name
vLineFile = 2
    
'main workbook
Windows(vWindowMain).Activate
Sheets("Plan1").Select
vRange = "A1"
vFolder = Range(vRange).Value
    
Do While True
    Application.ScreenUpdating = False
        
    vLineFile = vLineFile + 1
    Windows(vWindowMain).Activate
    Sheets("Plan1").Select
    vRange = "A" + Trim(Str(vLineFile))
    vFile = Range(vRange).Value
    vFileName = vFolder + "\" + vFile 'xml arquives are listed on the main workbook
        
    If vFile = "" Then
        Exit Do
    End If
        
    Windows(vWindowXML).Activate
    
    'open xml
    Set XDoc = CreateObject("MSXML2.DOMDocument")
    XDoc.async = False: XDoc.validateOnParse = False
    XDoc.load (vFileName)
    Set myNodes = XDoc.SelectNodes("//data/value")
    If myNodes.Length > 0 Then
        For nNode = 0 To myNodes.Length - 1
            Set myNode = myNodes(nNode)
            If myNode Is Nothing Then
                Debug.Print "Nenhum item encontrado"
            Else
                Set myChildNodes = myNode.ChildNodes ' Get the children of the first node.
                For nChildNode = 0 To myChildNodes.Length - 1
                    vNode = myChildNodes(nChildNode).Text
                    Windows(vWindowXML).Activate
                    With Workbooks("XmlOrionv5.xlsx") 'secondary workbook is not being the one receiving the values, why?
                        vRange2 = "A" + Trim(Str(nNode + 2))
                        Range(vRange2).Value = vNode
                    End With
                Next nChildNode
            End If
        Next nNode
    Else
        Debug.Print "Nenhum item encontrado"
    End If

Loop

我知道这些变量是我没有使用的,我认为这不是完成这项任务的最佳方式,但这是我现在理解的方式。使用类似的函数在辅助工作簿中写入没有问题,但是我从另一个 Excel 工作簿而不是 xml 文本文件中获取值。 with 命令现在是我的第二种方法......在我只使用选择工作簿和选择工作表之前,也没有工作。这是因为我正在使用指针和 arquive 库吗?我该如何解决这个问题?

【问题讨论】:

  • 有关如何避免使用Select 的综合指南,请参阅this

标签: excel xml vba


【解决方案1】:

不要使用SelectActivate。尽管从直觉上看,它们看起来非常有用,但实际上它们几乎没有任何用处。

改为使用 Workbook 和 Worksheet 对象。您可以使用这些对象在您想要的位置进行更改。

例如

Dim wb As Workbook
Dim ws As Worksheet

Set wb = Workbooks("NAME") 'Change the name to the correct name
Set ws = wb.Worksheets(1) 'Change nr. to correct index, or use name

With ws
    'e.g.
    .Range("A1:A10").Value = "test"    
End With

【讨论】:

  • 非常感谢,它就像一个魅力!现在将其应用于我的所有工作表。
  • 很高兴能帮上忙!
  • 当我没有在范围之前写点时,它会返回将值粘贴到错误的工作簿上。你知道为什么需要这个点吗?或者我在哪里可以知道为什么会发生这种情况?
  • With 语句使您无需为每个范围指定工作簿/工作表。通常,您会写Workbooks("Name").Sheets(1).Range("A1").Value = 1(或ws.Range("A1").Value = 1,因为ws 在这里指定了一个特定的工作表),但With 语句将其归结为.Range("A1").Value = 1。省略句号只会使Range 引用任何处于活动状态的工作簿/工作表。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 2017-12-20
  • 2023-01-10
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多