Excel:创建可排序的化合物ID

时间:2011-05-25 15:38:53

标签: excel excel-vba vba

所有,我问了一个问题“Excel VBA:排序,然后复制和粘贴”,并收到了两个很好的答案。但是,因为我未能提供足够的用户需求,所以它们无法工作:我要求修复我创建的现有解决方案,而不是指定实际的业务需求,看看是否有人有更好的方法。

(叹气)这里:

我的老板让我创建一个ss来记录问题。他想要一个复合ID,它将“已分配日期”与一个数字联系起来,该数字表示当天只有的数字问题。新的一天,计数必须重新开始1.例如:

Assigned     Issue   Concatenated
  Date    &  Count =      ID

5/11/2011 &    1   =   5112011-1
5/11/2011 &    2   =   5112011-2
5/11/2011 &    3   =   5112011-3
5/12/2011 &    1   =   5122011-1

我用计算= IF(D2<> D1,1,C1 + 1)的隐藏列C解决了这个问题,因此如果D列中的指定日期相同,则通过递增先前的发布计数来计算问题计数作为上一个日期,并在日期更改时从1开始。另一列连接指定的日期和问题计数,我有我的问题ID。

快速,简单,优雅,进出,完成。对?但是当我交付ss时,他指出如果你(也就是说,他)对电子表格的任何部分进行排序,那么问题ID就会失序。当然---如果行按照“分配日期”顺序排序,则每个公式都不会依次引用上一个日期。

我的直接想法,即提示我之前的问题,是首先正确地重新排序分配日期顺序,然后复制并粘贴计算的问题计数的值以将其锁定,从而保留连接的ID。

我能看到的另一种方法(在VBA,natch中)是:

  
      
  1. 评估“分配日期”列中的所有日期
  2.   
  3. 评估“问题计数”列中的所有数字
  4.   
  5. 计算在给定的指定日期分配的新项目的最新顺序问题计数
  6.   
  7. 将该顺序问题计数分配给新项目
  8.   
  9. 然后很好然后将光标放入用户通常会去的下一个单元格中,该单元格恰好与刚输入的指定日期相邻;但是,这不是必要的
  10.   

这样可以避免重新排序物理ss的需要。然而,除了一个朦胧的猜测,这将涉及VLOOKUP,我一无所获。我通过搜索找不到任何东西。

有人可以帮忙吗?或建议去的地方?感谢!!!

3 个答案:

答案 0 :(得分:0)

听起来您只想自动执行“粘贴特殊”操作。以下内容将a1:a100中的公式替换为其计算值:

   Set src = ActiveSheet.Range("a1:a100")

    src.Copy
    src.Select

    Selection.PasteSpecial Paste:=xlPasteValues, _
        Operation:=xlNone, _
        SkipBlanks:=False, _
        Transpose:=False

答案 1 :(得分:0)

我认为公式=IF(D2<>D1,1,C1+1)可以改进,因为这取决于日期的顺序。以下内容将保留任何已排序的订单的计数

假设

     ColA           ColB                   ColC
Row1 Assigned_Date  Issue Count            Concatenate
Row2 05/11/2011     =COUNTIF($A$1:A2,A2)   =TEXT(A2,"ddmmyyyy")&"-"&B2
Row3 05/11/2011     =COUNTIF($A$1:A3,A3)   =TEXT(A3,"ddmmyyyy")&"-"&B3
Row4 05/12/2011     =COUNTIF($A$1:A4,A4)   =TEXT(A4,"ddmmyyyy")&"-"&B4
Row5 05/11/2011     =COUNTIF($A$1:A5,A5)   =TEXT(A5,"ddmmyyyy")&"-"&B5

基本上输入B2和C2公式并向下拖动。您可能需要将ddmmyyyy交换为mmddyyyy,因为我们首先使用日期而不是几个月:)

另外,请注意仅使用$ - $ A $ 1 锁定范围的第一部分:Ax

这适用于您当前的问题,但如果按日期的时间顺序分配了问题计数,则无效。

答案 2 :(得分:0)

使用程序怎么样?只需单击按钮即可添加下一个条目。

我假设这些条目将在今天的日期给出,并且表单布局是: 行:1 =标题/ 2 =左空白/ 3 =数据块的标题 列:A =日期/ B =发行计数/ C =组合ID / D等=其他数据

Sub AddEntry()
Dim iDayRef As Long, iNumRows As Long, n As Long

With Range("A3")
    iNumRows = .CurrentRegion.Rows.Count
    For n = 2 To iNumRows
        If .Cells(n, 1).Value = Date Then
            If .Cells(n, 2).Value > iDayRef Then iDayRef = .Cells(n, 2).Value
        End If
    Next
    .Cells(iNumRows + 1, 1).Value = Date
    .Cells(iNumRows + 1, 2).Value = iDayRef + 1
    .Cells(iNumRows + 1, 3).Value = Format(Date, "mm/dd/yyyy") & " - " & iDayRef + 1
    .Cells(iNumRows + 1, 4).Select
End With
End Sub

你真的需要三列Date,Count和Combined ID吗?如果你去了

yyyy / mm / dd - xx

ID格式,一列可以替换所有三种,您可以轻松对其进行排序。