2014-10-06 31 views
2

我曾在Access中对几个表进行查询,并意识到表中的一列不符合特定要求。如何将给定字段中的年份划分为单个年份?

我有一个由数千个记录组成的字段,它包含以下格式(示例)中的“年”:1915-1918

我想完成的是在记录中创造个人价值。所以 最终结果将是:1915,1916,1917,1918

基本上,我想将1915-1918转换为1915,1916,1917,1918

我认为一个简单的连接就足够了,但不能包装我的头如何使它可以做到所有成千上万的记录。我做了一些研究并得出结论,用户定义的函数可能是要走的路。我将如何去做这件事?

回答

1

当你的域值由4位数字加一个破折号再加上4个数字,这个函数返回逗号分隔的年份列表。

在其他任何情况下(Null,单一年如“1915”而不是年份范围或其他),函数返回起始值。

Public Function YearList(ByVal pInput As Variant) As Variant 
    Dim astrPieces() As String 
    Dim i As Long 
    Dim lngFirst As Long 
    Dim lngLast As Long 
    Dim varReturn As Variant 

    If pInput Like "####-####" Then 
     astrPieces = Split(pInput, "-") 
     lngFirst = CLng(astrPieces(0)) 
     lngLast = CLng(astrPieces(1)) 
     For i = lngFirst To lngLast 
      varReturn = varReturn & "," & CStr(i) 
     Next 
     If Len(varReturn) > 0 Then 
      varReturn = Mid(varReturn, 2) 
     End If 
    Else 
     varReturn = pInput 
    End If 
    YearList = varReturn 
End Function 

但是,这种方法假设每个范围的开始年份都将小于结束年份。换句话说,您需要投入更多的精力才能使YearList("1915-1912")返回一个年份列表而不是空字符串。

如果该函数返回所需内容,则可以在SELECT查询中使用该函数。

SELECT years_field, YearList(years_field) 
FROM YourTable; 

或者,如果你想在你多年的现场更换存储的值,你可以在UPDATE查询中使用该功能。

UPDATE YourTable 
SET years_field = YearList(years_field); 
+0

谢谢你的回复,我查看了代码,以确保我明白了(我想学习,当我通过这个)。我有一个非常大的查询,所以当调用函数查询时,我得到一个“表达式中未定义的函数”。我查了可能的问题,但似乎没有涉及这个问题。我将该函数的名称更改为“Conversion”,因为它被称为“YearList”,显然它不能是相同的名称,但这并没有改变任何内容。有任何想法吗 ?谢谢btw – Jeff 2014-10-06 21:11:21

+0

如果你改变函数的名字,一定要在两个地方改变它:'Public Function YearList'和'YearList = varReturn'。在立即窗口测试你的功能:'?转换(“1915-1918”)'它有效吗? – HansUp 2014-10-06 21:17:15

+0

好吧,我不断收到编译错误,我意识到模块名称和他们内的程序有相同的名称,他们不应该。一旦我改变了模块的名称,它就可以在即时窗口中完美编译。我现在尝试并实现查询。 – Jeff 2014-10-07 13:38:03

0

在Excel中,为期望遇到的年数范围制作年份的顺序参考表。

接下来,使用左右函数来获取范围的开始和结束。

创建一个更新查询并使用目标字段串联到它自己来更新目标字段,然后还可以在该范围的开始和结束之间适合的参考年值。

或者我想你可以做一个用户功能。

1

可以使用Split函数从包含上一年和下一年的“年份”字段返回一个数组。然后从较低年份开始循环到较高年份并构建连接字符串。例如:

Public Function SplitYears(Years As String) As String 
    Dim v As Variant 
    Dim i As Long 
    Dim s As String 

    v = Split(Years, "-", 2) 
    If UBound(v) = 1 Then 
     For i = v(0) To v(1) 
      s = s & "," & CStr(i) 
     Next i 
     s = Right(s, Len(s) - 1) 
    Else 
     s = v(0) 
    End If 
    SplitYears = s 

End Function 
0

在查询中添加以下代码到一个模块在Visual Basic

Public Function CommaDates(Start_End) As String 
    Dim strt As String 
    Dim endd As String 
    Dim x As Long 

    strt = Left(Start_End, 4) 
    endd = Right(Start_End, 4) 
    CommaDates = strt 

    For x = strt + 1 To endd 
     CommaDates = CommaDates & "," & x 
    Next x 
End Function 

调用此类似NEW_DATE: CommaDates([OLD_DATE_FIELD_NAME])

相关问题