首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据日期复制另一列中的值范围

根据日期复制另一列中的值范围
EN

Stack Overflow用户
提问于 2015-09-17 12:00:33
回答 1查看 4K关注 0票数 0

我正在尝试编写一个宏,该宏根据另一列中相应的日期在一列中复制一系列值。

例如,我需要复制G列中对应于B栏中日期的值。2015年9月18日,我需要从B栏中根据9/18/2015日期选择和复制G列的范围,然后对9/19等所有其他日期进行相同的操作。然后,我将它粘贴到其他几个页面上,尽管代码的这一部分不在这里。

下面的尝试只检查B列中的日期,然后在G列中复制一个范围。我相信我需要一个for循环,但我不知道如何正确地构建它以满足我的需要。

代码语言:javascript
运行
AI代码解释
复制
 If ActiveCell >= Date + 1 And ActiveCell <= Date + 7 Then

' Compare date on Day Sheet to sheet s and select cells in column G
' corresponding to that date

        x = ActiveCell
        ActiveWorkbook.Sheets("s").Activate
        Range("B2").Select

' If statement to check if dates match

            If ActiveCell = x Then
            Range("G2").Select
            ActiveCell.Offset(0, 5).Select
            Range("G2:G10").Copy
            Else
            End If
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-18 05:28:22

哦,这太恐怖了。我现在有一个几乎相同的任务--除了我的任务是每月从SQL导入到Excel的飞行日志,它必须将每天的工作时间转移到飞行员的个人工作表中。将“帐户”改为“飞行员”和“数量”为“飞行时间”,我们的项目是完全相同的。

实际上,我已经在下面剪切和粘贴了我的代码,它将为您完成整个shabang。在StackOverflow上为他们解决整个任务并不是很好的形式,但在这种情况下,只粘贴一些过程似乎毫无意义。

对我来说,最大的教训是只把Excel当作数据检索和数据显示接口。诀窍是创建您自己的数据结构,将数据读入其中,根据需要操作/询问它们,然后在所有工作完成后将结果写入工作表。换句话说,避免像瘟疫一样的宏生成器!我更怀疑你的复制单元格x,y粘贴到单元格r,c方法会带你到相同的死胡同,我去了。我发现最好的方法是有一个飞行员的Dictionary (你的帐户),然后是飞行日期的内部Dictionary (值/日期)。然后,您只需测试每日工作表中每个帐户的帐户密钥和日期键。

要访问Dictionary对象,您需要引用Microsoft Scripting Runtime (Tools ->引用.->通过勾选在列表中选择)。

您需要创建两个类--这是您的数据字段。调用第一个cAccountFields并向类添加以下代码:

代码语言:javascript
运行
AI代码解释
复制
Public AccountName As String
Public ActivityByDate As Dictionary
Public Sub Create(accName As String)
    Me.AccountName = accName
    Set Me.ActivityByDate = New Dictionary
End Sub

调用第二个cActivityFields并向类添加以下代码:

代码语言:javascript
运行
AI代码解释
复制
Public DateOf As Date
Public Value As Double
Public Sub Create(dat As Date, val As Double)
    Me.DateOf = dat
    Me.Value = val
End Sub

然后将以下代码添加到模块中即可。私有常量需要在模块级别(即页面顶部)声明。您可以使用这些来定义行和列引用--如果它们匹配飞行员的日志,那将是非常奇怪的:

代码语言:javascript
运行
AI代码解释
复制
Private Const DB_SHEET As String = "Sheet1"
Private Const DB_DATE_COL As String = "B"
Private Const DB_ACCOUNT_COL As String = "C"
Private Const DB_VALUE_COL As String = "G"
Private Const DB_ACCOUNT_START_ROW As Long = 1
Private Const DAY_DATE_ADDRESS As String = "A1"
Private Const DAY_ACCOUNT_COL As String = "A"
Private Const DAY_VALUE_COL As String = "B"
Private Const DAY_ACCOUNT_START_ROW As Long = 2


Public Sub ProcessData()
    Dim daySheets As Collection
    Dim accountsFromDB As Dictionary
    Dim account As cAccountFields
    Dim activity As cActivityFields
    Dim ws As Worksheet
    Dim dat As Date
    Dim accName As String
    Dim accValue As Double
    Dim endRow As Long
    Dim r As Long

    ' Create a Collection of the Day sheets
    Set daySheets = New Collection
    For Each ws In ThisWorkbook.Worksheets
        If Left(ws.Name, 4) = "Day " Then
            daySheets.Add ws
        End If
    Next

    ' Read the database sheet
    Set ws = ThisWorkbook.Worksheets(DB_SHEET)
    Set accountsFromDB = New Dictionary

    endRow = ws.Cells.Find(What:="*", _
                           After:=ws.Range("A1"), _
                           LookIn:=xlFormulas, _
                           LookAt:=xlPart, _
                           SearchOrder:=xlByRows, _
                           SearchDirection:=xlPrevious).Row

    For r = DB_ACCOUNT_START_ROW To endRow

        dat = ws.Cells(r, DB_DATE_COL).Value2
        accName = ws.Cells(r, DB_ACCOUNT_COL).Text
        accValue = ws.Cells(r, DB_VALUE_COL).Value2

        ' Add the account or retrieve it if it already exists.
        If Not accountsFromDB.Exists(accName) Then
            Set account = New cAccountFields
            account.Create accName
            accountsFromDB.Add key:=accName, Item:=account
        Else
            Set account = accountsFromDB.Item(accName)
        End If

        ' Add the value for a specific date.
        If Not account.ActivityByDate.Exists(dat) Then
            Set activity = New cActivityFields
            activity.Create dat, accValue
            account.ActivityByDate.Add key:=dat, Item:=activity
        Else
            ' If the same account and date occurs, then aggregate the values.
            Set activity = account.ActivityByDate(dat)
            activity.Value = activity.Value + accValue
        End If

    Next

    ' Populate the Day sheets
    For Each ws In daySheets

        dat = ws.Range(DAY_DATE_ADDRESS).Value2

        endRow = ws.Cells.Find(What:="*", _
                               After:=ws.Range("A1"), _
                               LookIn:=xlFormulas, _
                               LookAt:=xlPart, _
                               SearchOrder:=xlByRows, _
                               SearchDirection:=xlPrevious).Row

        For r = DAY_ACCOUNT_START_ROW To endRow

            accName = ws.Cells(r, DAY_ACCOUNT_COL).Text

            ' If account and value for this date exists then write the value
            If accountsFromDB.Exists(accName) Then
                Set account = accountsFromDB.Item(accName)
                If account.ActivityByDate.Exists(dat) Then
                    Set activity = account.ActivityByDate.Item(dat)
                    ws.Cells(r, DAY_VALUE_COL).Value = activity.Value
                End If
            End If

        Next

    Next

End Sub

在OPs Q之后更新:

在模块级别添加其他常量,并酌情修改:

代码语言:javascript
运行
AI代码解释
复制
Private Const DB_BOOK As String = "Macro Test File.xlsx"
Private Const DAY_BOOK As String = "Macro Test File.xlsx"
Private Const INITIAL_SHEET As String = "Initial Revenue"
Private Const INITIAL_COL As String = "E"

然后使用以下代码:

代码语言:javascript
运行
AI代码解释
复制
Dim daySheets As Collection
Dim accountsFromDB As Dictionary
Dim account As cAccountFields
Dim activity As cActivityFields
Dim dbWb As Workbook
Dim dayWb As Workbook
Dim ws As Worksheet
Dim dat As Date
Dim accName As String
Dim accValue As Double
Dim endRow As Long
Dim r As Long

' Assign the workbook containing the database sheet
On Error Resume Next
Set dbWb = Workbooks(DB_BOOK)
On Error GoTo 0
If dbWb Is Nothing Then
    MsgBox "Please open " & DB_BOOK & " in this application and run this routine again."
    End
End If

' Assign the workbook containing the days sheets
On Error Resume Next
Set dayWb = Workbooks(DAY_BOOK)
On Error GoTo 0
If dayWb Is Nothing Then
    MsgBox "Please open " & DAY_BOOK & " in this application and run this routine again."
    End
End If


' Create a Collection of the Day sheets
Set daySheets = New Collection
For Each ws In dayWb.Worksheets
    If Left(ws.Name, 4) = "Day " Then
        daySheets.Add ws
    End If
Next

' Read the database sheet
Set ws = dbWb.Worksheets(DB_SHEET)
Set accountsFromDB = New Dictionary

endRow = ws.Cells.Find(What:="*", _
                       After:=ws.Range("A1"), _
                       LookIn:=xlFormulas, _
                       LookAt:=xlPart, _
                       SearchOrder:=xlByRows, _
                       SearchDirection:=xlPrevious).Row

For r = DB_ACCOUNT_START_ROW To endRow

    dat = ws.Cells(r, DB_DATE_COL).Value2
    accName = ws.Cells(r, DB_ACCOUNT_COL).Text
    accValue = ws.Cells(r, DB_VALUE_COL).Value2

    ' Add the account or retrieve it if it already exists.
    If Not accountsFromDB.Exists(accName) Then
        Set account = New cAccountFields
        account.Create accName
        accountsFromDB.Add Key:=accName, Item:=account
    Else
        Set account = accountsFromDB.Item(accName)
    End If

    ' Add the value for a specific date.
    If Not account.ActivityByDate.Exists(dat) Then
        Set activity = New cActivityFields
        activity.Create dat, accValue
        account.ActivityByDate.Add Key:=dat, Item:=activity
    Else
        ' If the same account and date occurs, then aggregate the values.
        Set activity = account.ActivityByDate(dat)
        activity.Value = activity.Value + accValue
    End If

Next

' Populate the Day sheets
For Each ws In daySheets

    dat = ws.Range(DAY_DATE_ADDRESS).Value2

    endRow = ws.Cells.Find(What:="*", _
                           After:=ws.Range("A1"), _
                           LookIn:=xlFormulas, _
                           LookAt:=xlPart, _
                           SearchOrder:=xlByRows, _
                           SearchDirection:=xlPrevious).Row

    For r = DAY_ACCOUNT_START_ROW To endRow

        ' Write the standard formula into the cell
        ws.Cells(r, DAY_VALUE_COL).Formula = "='" & INITIAL_SHEET & "'!" & _
                                             INITIAL_COL & CStr(r)

        accName = ws.Cells(r, DAY_ACCOUNT_COL).Text

        ' If account and value for this date exists then write the value
        If accountsFromDB.Exists(accName) Then
            Set account = accountsFromDB.Item(accName)
            If account.ActivityByDate.Exists(dat) Then
                Set activity = account.ActivityByDate.Item(dat)
                ws.Cells(r, DAY_VALUE_COL).Formula = ws.Cells(r, DAY_VALUE_COL).Formula & _
                                                     " + " & CStr(activity.Value)
            End If
        End If

    Next

Next
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32638979

复制
相关文章
Swift 日历添加事件 删除事件
import EventKit /** Privacy - Calendars Usage Description 添加日历权限 info.list 配置权限 */ /// 日历添加事件 class KKAddEventClasse: NSObject { /// 添加成功回调 typealias SuccessAddEvent = ((_ identifier: String) -> Void) /// 添加失败回调 typealias ErrorAddEvent =
菜菜不吃蔡
2021/03/20
4.1K1
如何获取相应tableview中的touchesBegan事件[通俗易懂]
项目中使用了UITableViewController,里面有用到UITextView需要点击键盘外的地方来隐藏我的键盘
全栈程序员站长
2022/09/15
1.6K0
如何从列表中获取元素
观察URAM的物理管脚,不难发现A/B端口都有相应的地址、使能、读写控制信号。与BRAM不同的是URAM的读写使能信号是同一个管脚RDB_WR_A/B,其为0时执行读操作,为1时执行写操作,这意味着一旦A/B端口独立,同一端口的读写操作就无法同时发生,因此,如果采用上一篇文章中介绍的方法将其配置为两个独立的单端口RAM,其读写行为与常规的单端口RAM是不同的,进一步而言,此时的读写行为类似于NO_Change模式。
Lauren的FPGA
2019/10/30
18.8K0
如何从JavaScript对象中删除属性?
在使用 JavaScript 中的对象时,你可能会遇到需要从对象中完全删除属性的情况。为实现这一点可以有好几个选择:
疯狂的技术宅
2021/04/01
13.2K0
如何从组中删除Linux用户?
在Linux中,用户可以是一个主要组和一个或几个次要(辅助)组的成员。文件“ / etc / group”为Linux系统中的每个用户定义了组成员身份。
用户6543014
2020/04/07
20.3K0
Javascript 中如何存储,获取和删除 Cookies
Javascript 中如何存储,获取和删除 Cookies。 function setCookie(name,value){ var exp = new Date(); exp.setTime(exp.getTime() + 30*24*60*60*1000); document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString(); } function getCookie(name){
Denis
2023/04/15
1.6K0
从Git仓库中恢复已删除的分支、文件或丢失的commit
比如:执行checkout -f 或 reset -hard 或 branch -d删除一个分支
用户8705050
2021/06/08
3.7K0
如何从Ubuntu Linux中删除Firefox Snap?
Ubuntu Linux是一款广受欢迎的开源操作系统,拥有强大的功能和广泛的应用程序选择。默认情况下,Ubuntu提供了一种称为Snap的软件打包格式,用于安装和管理应用程序。Firefox是一款流行的开源网络浏览器,而Firefox Snap是Firefox的Snap版本。
网络技术联盟站
2023/05/25
5.6K0
如何从Ubuntu Linux中删除Firefox Snap?
Exchange删除移动完成的邮箱记录
在Exchange服务器维护中,常用 New-MoveRequest 命令来移动邮箱到指定的数据库。要想查询移动的状态,可使用 Get-MoveRequest 命令来获取移动的状态。
水中游泳的小鸟
2019/03/16
1.2K0
如何从 Python 列表中删除所有出现的元素?
在 Python 中,列表是一种非常常见且强大的数据类型。但有时候,我们需要从一个列表中删除特定元素,尤其是当这个元素出现多次时。本文将介绍如何使用简单而又有效的方法,从 Python 列表中删除所有出现的元素。
网络技术联盟站
2023/06/01
14K0
Spring 如何从 IoC 容器中获取对象?
前面几篇文章主要分析了 Spring IoC 容器如何初始化,以及解析和注册我们定义的 bean 信息。
WriteOnRead
2021/03/12
10.4K0
Spring 如何从 IoC 容器中获取对象?
网页中如何获取客户端系统已安装的所有字体?
如何获取系统字体? 1.首先在需要获取系统字体的网页<body>后加入以下代码: <DIV style="LEFT: 0px; POSITION: absolute; TOP: 0px"> <OBJECT ID="dlgHelper" CLASSID="clsid:3050f819-98b5-11cf-bb82-00aa00bdce0b" WIDTH="0px" HEIGHT="0px"> </OBJECT> <script src="FontFacesMenu.js" language="javascript" type="text/javascript"></script> </DIV>
Java架构师必看
2021/03/22
7.4K0
如何优雅的从Array中删除一个元素
从JavaScript数组中删除元素是开发人员经常遇到的常见编程范例。与许多JavaScript一样,这并不像它应该的那么简单。
Jean
2018/12/21
10.3K0
如何从 Python 中的字符串列表中删除特殊字符?
在进行字符串处理和文本分析时,有时我们需要从字符串列表中删除特殊字符。特殊字符可能是空格、标点符号、换行符等,在某些情况下它们可能干扰我们的文本处理或分析任务。Python 提供了多种方法来删除字符串列表中的特殊字符。本文将详细介绍在 Python 中删除字符串列表中特殊字符的几种常用方法,并提供示例代码帮助你理解和应用这些方法。
网络技术联盟站
2023/06/01
9.5K0
Git 命令行教程:如何在 GitLab 中恢复已删除的分支
在软件开发过程中,版本控制是一个至关重要的环节。Git 是最流行的分布式版本控制系统之一,它能够帮助团队高效地管理代码。然而,有时候会发生意外,例如代码误合、错误的删除等情况,导致重要的开发分支本地和远程不慎被删除。本文将为您介绍如何使用 Git 命令行在 GitLab 中恢复已删除的分支,帮助您快速解决这类问题。
修己xj
2023/08/25
1.4K0
Git 命令行教程:如何在 GitLab 中恢复已删除的分支
Android向系统日历添加日程事件
在项目开发过程中,有时会有预约提醒、定时提醒等需求,这时我们可以使用系统日历来辅助提醒。通过向系统日历中写入事件、设置提醒方式(闹钟),实现到达某个特定的时间自动提醒的功能。这样做的好处是由于提醒功能是交付给系统日历来做,不会出现应用被杀情况,能够做到准时提醒。 一般来说实现向系统日历中读写事件一般有以下几个步骤: (1)需要有读写日历权限; (2)如果没有日历账户需要先创建账户; (3)实现日历事件增删改查、提醒功能;
developerHaoz
2022/05/13
3.3K0
从DataFrame中删除列
在操作数据的时候,DataFrame对象中删除一个或多个列是常见的操作,并且实现方法较多,然而这中间有很多细节值得关注。
老齐
2021/03/29
7.7K0
算法-删除已排序数组中的重复项
版权声明: https://blog.csdn.net/li_xunhuan/article/details/89843311
Fisherman渔夫
2019/07/31
3.6K0
点击加载更多

相似问题

如何在颤振项目中使用Logger

26

Dart /颤振错误:“toStringDeep”未为类“Logger”定义

41

颤振:颤振插件、颤振软件包和颤振模块有什么区别?

24

Android和颤振

14

颤振清洁和颤振运行(Ios)永不结束

18
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档