ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 919|回复: 12

[求助] 请教VBA实现内容提取合并问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-7-5 16:31 | 显示全部楼层 |阅读模式
本帖最后由 6xueren 于 2023-7-5 16:40 编辑

image.png


请教一下,上图中如何用VBA实现下图效果,其中的开盘价为当日四个时间段中10:30的开盘价,最高价为当日四个时间段的最高价,最低价为当日四个时间段的最低价,收盘价为当日四个时间段中15:00的收盘价,成交量为当日四个时间段中的成交量的总和。
image.png


用以下代码出来的不太理想不知哪里的问题。
代码:

Sub ProcessData()
    Dim lastRow As Long
    lastRow = Range("A" & Rows.Count).End(xlUp).Row
   
    ' 声明变量
    Dim currentDate As Date
    Dim currentOpen As Double
    Dim currentHigh As Double
    Dim currentLow As Double
    Dim currentClose As Double
    Dim currentVolume As Long
    Dim newRowIndex As Long
    Dim i As Long
   
    ' 设置起始行
    newRowIndex = 2
   
    ' 遍历数据
    For i = 2 To lastRow
        ' 获取当前行的日期和时间
        currentDate = Range("A" & i).Value
        
        ' 检查是否为新的日期
        If Format(currentDate, "hh:mm") = "10:30" Then
            ' 如果是新的日期,则将之前日期的数据写入新行
            If newRowIndex > 2 Then
                Range("H" & newRowIndex).Value = Format(currentDate, "yyyy/mm/dd")
                Range("I" & newRowIndex).Value = currentOpen
                Range("J" & newRowIndex).Value = currentHigh
                Range("K" & newRowIndex).Value = currentLow
                Range("L" & newRowIndex).Value = currentClose
                Range("M" & newRowIndex).Value = currentVolume
                newRowIndex = newRowIndex + 1
            End If
            
            ' 重置新日期的数据
            currentOpen = Range("B" & i).Value
            currentHigh = Range("C" & i).Value
            currentLow = Range("D" & i).Value
            currentClose = 0
            currentVolume = 0
        End If
        
        ' 更新当日的数据
        currentHigh = Application.WorksheetFunction.Max(currentHigh, Range("C" & i).Value)
        currentLow = Application.WorksheetFunction.Min(currentLow, Range("D" & i).Value)
        currentClose = Range("E" & i).Value
        currentVolume = currentVolume + Range("F" & i).Value
        
        ' 如果是最后一个时间段(15:00),则将数据写入新行
        If Format(currentDate, "hh:mm") = "15:00" Then
            Range("H" & newRowIndex).Value = Format(currentDate, "yyyy/mm/dd")
            Range("I" & newRowIndex).Value = currentOpen
            Range("J" & newRowIndex).Value = currentHigh
            Range("K" & newRowIndex).Value = currentLow
            Range("L" & newRowIndex).Value = currentClose
            Range("M" & newRowIndex).Value = currentVolume
            newRowIndex = newRowIndex + 1
        End If
        
        ' 如果是最后一行数据,则将当前日期的数据写入新行
        If i = lastRow Then
            Range("H" & newRowIndex).Value = Format(currentDate, "yyyy/mm/dd")
            Range("I" & newRowIndex).Value = currentOpen
            Range("J" & newRowIndex).Value = currentHigh
            Range("K" & newRowIndex).Value = currentLow
            Range("L" & newRowIndex).Value = currentClose
            Range("M" & newRowIndex).Value = currentVolume
        End If
    Next i
   
    ' 删除未使用的行
    Range("H" & newRowIndex + 1 & ":M" & lastRow).ClearContents
End Sub


image.png






汇总.rar

41.04 KB, 下载次数: 4

TA的精华主题

TA的得分主题

发表于 2023-7-5 18:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
开盘价与收盘价要均价?

TA的精华主题

TA的得分主题

发表于 2023-7-5 19:22 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
汇总.rar (46.13 KB, 下载次数: 8)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-5 21:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
鄂龙蒙 发表于 2023-7-5 18:47
开盘价与收盘价要均价?

当日4个时间点最早的是开盘价,最晚的是收盘价

TA的精华主题

TA的得分主题

发表于 2023-7-5 21:39 | 显示全部楼层
请参考附件。。。

汇总.rar

46.13 KB, 下载次数: 14

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-7-5 22:17 | 显示全部楼层
代码审核中。
GIF 2023-07-05 22-16-18.gif

汇总.zip

30.28 KB, 下载次数: 5

TA的精华主题

TA的得分主题

发表于 2023-7-5 22:18 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub limonet()
    Dim Cn As Object, StrSQL$
    Set Cn = CreateObject("adodb.connection")
    Cn.Open "provider=microsoft.ace.oledb.12.0;extended properties=excel 12.0;data source=" & ThisWorkbook.FullName
    StrSQL = "select 日期,first(开盘价),max(最高价),min(最低价),last(收盘价),sum(成交量) from (select Int(日期) as 日期,开盘价,最高价,最低价,收盘价,成交量 from [Sheet1$A:F] where 日期>0) group by 日期"
    Range("H2").CopyFromRecordset Cn.Execute(StrSQL)
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-5 22:19 | 显示全部楼层
gwjkkkkk 发表于 2023-7-5 21:39
请参考附件。。。

程序精简而强大,可惜我这小白看不懂

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-7-6 09:33 | 显示全部楼层
limonet 发表于 2023-7-5 22:18
Sub limonet()
    Dim Cn As Object, StrSQL$
    Set Cn = CreateObject("adodb.connection")

请教这代码在插入的对象文件中无法使用,已经把原代码里的sheet1改为工作表的名称sheet4,还是提示这个: sshot-900.png



image.png


image.png


image.png

TA的精华主题

TA的得分主题

发表于 2023-7-6 09:38 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-16 22:01 , Processed in 0.053494 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表