【问题标题】:Automatically add a row or a value below the last non-empty / used row在最后一个非空/已使用的行下方自动添加一行或一个值
【发布时间】:2015-04-28 15:04:39
【问题描述】:

在两个“表格数据下载”部分之间,第一个表格的行数不固定。

如何添加VBA脚本,使其在第一个表最后使用的行之后自动添加五行,然后开始第二个表的下载?

Sub GetFinanceData()
For x = 1 To 5
Dim URL As String, elemCollection As Object
Dim t As Integer, r As Integer, c As Integer
Dim LastLine As Long
LastLine = Range("A1048576").End(xlUp).Row

Worksheets("Stocks").Select
Worksheets("Stocks").Activate

'Open IE and Go to the Website

URL = "http://stock.finance.sina.com.cn/hkstock/finance/00001.html"
URL = Cells(x, 1)

Set IE = CreateObject("InternetExplorer.Application")
With IE
    .navigate URL
    .Visible = True

Do While .Busy = True Or .readyState <> 4
    Loop
DoEvents

Worksheets.Add(After:=Worksheets(Worksheets.Count)).Name = _
ThisWorkbook.Worksheets("Stocks").Range("B" & x).Value

'Select the Report Type

Set selectItems = IE.Document.getElementsByTagName("select")
For Each i In selectItems
    i.Value = "zero"
    i.FireEvent ("onchange")
    Application.Wait (Now + TimeValue("0:00:05"))
Next i

Do While .Busy: DoEvents: Loop

ActiveSheet.Range("A1:K500").ClearContents

'Find and Get the First Table Data

Set elemCollection = .Document.getElementsByTagName("TABLE")
For t = 0 To (elemCollection.Length - 4)
    For r = 0 To (elemCollection(t).Rows.Length - 1)
        For c = 0 To (elemCollection(t).Rows(r).Cells.Length - 1)
ActiveSheet.Cells(r + 1, c + 1) = elemCollection(t).Rows(r).Cells(c).innerText
    Next c
    Next r
    Next t

'Find and Get the Second Table Data

Set elemCollection = .Document.getElementsByTagName("TABLE")
For t = 1 To (elemCollection.Length - 3)
    For r = 0 To (elemCollection(t).Rows.Length - 1)
        For c = 0 To (elemCollection(t).Rows(r).Cells.Length - 1)
ActiveSheet.Cells(r + 19, c + 1) = elemCollection(t).Rows(r).Cells(c).innerText
    Next c
    Next r
    Next t


'Find and Get the Third Table Data

Set elemCollection = .Document.getElementsByTagName("TABLE")
For t = 2 To (elemCollection.Length - 2)
    For r = 0 To (elemCollection(t).Rows.Length - 1)
        For c = 0 To (elemCollection(t).Rows(r).Cells.Length - 1)
ActiveSheet.Cells(r + 48, c + 1) = elemCollection(t).Rows(r).Cells(c).innerText
    Next c
    Next r
    Next t

'Find and Get the Fourth Table Data

Set elemCollection = .Document.getElementsByTagName("TABLE")
For t = 3 To (elemCollection.Length - 1)
    For r = 0 To (elemCollection(t).Rows.Length - 1)
        For c = 0 To (elemCollection(t).Rows(r).Cells.Length - 1)
ActiveSheet.Cells(r + 61, c + 1) = elemCollection(t).Rows(r).Cells(c).innerText
    Next c
    Next r
    Next t
End With

' cleaning up memory

IE.Quit

    Next x

End Sub

【问题讨论】:

  • 好的,我正在想象您从一张空白纸开始(在 ClearContents 之后),然后导入第一个表来表示第 1 到 90 行,然后导入表 2 来表示第 96 到 145 行。如果我是对,您真的要插入 5 行还是只是将行计数器增加 5?如果我了解您的情况,这似乎是无意义的操作。
  • 嗨,马克,第一个表 --> 插入 5 行 --> 下一个表--> 插入 5 行--> 下一个表,遵循此模式。提前致谢!
  • 另一件事我似乎无法弄清楚。 For t = 0 To (elemCollection.Length - 4) 如果这组三个循环只是为了导出第一个表,为什么存在外循环?为什么不用t = 0 替换外循环?
  • 嗨,Mark 抱歉误导,实际上有四个表,我刚刚发布了两个简化的原因,现在我更新了四个完整的表,你能再帮忙吗?

标签: excel vba add rows


【解决方案1】:

您似乎只希望每个表格之间有 5 行间距。这实际上不需要添加行。表格下方已有空白行。我建议只添加一个变量tblStartRow,它跟踪当前表的第一行并在Cells 调用中使用该变量。我将第一个表的值设置为 1,然后为第二个表计算一个新的起始行值。

'Find and Get the First Table Data

tblStartRow = 1
Set elemCollection = .Document.getElementsByTagName("TABLE")
For t = 0 To (elemCollection.Length - 4)
    For r = 0 To (elemCollection(t).Rows.Length - 1)
        For c = 0 To (elemCollection(t).Rows(r).Cells.Length - 1)
            ActiveSheet.Cells(r + tblStartRow, c + 1) = elemCollection(t).Rows(r).Cells(c).innerText
        Next c
    Next r
Next t

'Find and Get the Second Table Data

tblStartRow = tblStartRow + r + 4
Set elemCollection = .Document.getElementsByTagName("TABLE")
For t = 1 To (elemCollection.Length - 3)
    For r = 0 To (elemCollection(t).Rows.Length - 1)
        For c = 0 To (elemCollection(t).Rows(r).Cells.Length - 1)
            ActiveSheet.Cells(r + tblStartRow, c + 1) = elemCollection(t).Rows(r).Cells(c).innerText
        Next c
    Next r
Next t

此外,我认为将这些表分成它们自己的循环集没有任何意义,因此我会将所有表导出合并为(您会注意到我移动了重新分配 tblStartRow 值的语句):

tblNameArr = Array("Balance Sheet", "Cash Flow", "Header 3", "Header 4", "Header 5")
tblStartRow = 1
Set elemCollection = .Document.getElementsByTagName("TABLE")
For t = 0 To elemCollection.Length - 1
    For r = 0 To (elemCollection(t).Rows.Length - 1)
        For c = 0 To (elemCollection(t).Rows(r).Cells.Length - 1)
            ActiveSheet.Cells(r + tblStartRow, c + 1) = elemCollection(t).Rows(r).Cells(c).innerText
        Next c
    Next r
    ActiveSheet.Cells(r + tblStartRow + 2, 1) = tblNameArr(t)
    tblStartRow = tblStartRow + r + 4
Next t

我编辑了最后一个代码块,以在每个 OP 注释的表之间导出 A 列中的文本。

【讨论】:

  • 嗨,马克,经过测试,它可以工作了!非常感谢!但是,如果我想向插入的 4 行中的第 3 行(A 列)添加一个值,这可能吗?我要添加的每个值都是不同的。准确地说,模式是表1→2个空白行→1行,A列中有一个值,例如。 “资产负债表”→1 空白行→表 2→2 空白行→1 行在 A 列中有值,例如“现金流”→1空白行→表3等。提前致谢!
  • @NicholasKan 看看更新后的代码。这能解决你的问题吗?
  • @NicholasKan 如果答案适合您的问题,请接受。
  • 是的!但不能加汉字。天哪
  • 马克,下面是html代码,你能帮忙设置代码以通过标签/名称/id获取值吗?我想将值设置为表格的标题,因为我无法在 VBA 中输入中文...T_T 模式:第 1 行到第 4 行,空白,然后从第 5 行开始:A 列中的值“a1”一个空白行表1 两个空白行 A 列中的值“a2” 一个空白行 表 2 两个空白行 A 列中的值“a3” 一个空白行 表 3 两个空白行 A 列中的值“a4” 一个空白行 表 4
猜你喜欢
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 2021-08-03
相关资源
最近更新 更多