- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个以月/年为标题的列列表(例如 JAN09、FEB09、AUG10)。我必须检查月份是否按顺序对齐。如果没有,则将其对齐,如果特定月份不可用,则创建列名称标题作为月份名称并继续。我已经编写了一个代码,但它在第一年有效(比如从 09-11 年,它将识别 09 的所有月份,但之后它无法识别并每次创建一个新月份,即使它存在)。
Sub MonthFinder()
Dim montharray As Variant
montharray = Array("JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC")
lastrow = ActiveSheet.UsedRange.Rows.Count + 5
lastcol = ActiveSheet.UsedRange.Columns.Count
minmonth = Right(Cells(5, 2), 2)
range0 = 2
maxmonth = Right(Cells(5, 2), 2)
Do Until range0 > lastcol
If Right(Cells(5, range0), 2) < minmonth Then
minmonth = Right(Cells(5, range0), 2)
End If
If Right(Cells(5, range0), 2) > maxmonth Then
maxmonth = Right(Cells(5, range0), 2)
End If
range0 = range0 + 1
Loop
minsortmonth = minmonth
maxsortmonth = maxmonth
place = 2
Do Until minsortmonth = maxsortmonth + 1
arraycount = 0
Do Until arraycount = 12
range1 = 2
lastcol = ActiveSheet.UsedRange.Columns.Count
Do Until Left(Cells(5, range1), 3) = montharray(arraycount) And Right(Cells(5, range1), 2) = minsortmonth Or range1 > lastcol
range1 = range1 + 1
Loop
If range1 > lastcol Then
Range(Cells(5, place), Cells(lastrow, place)).Select
Selection.Insert Shift:=xlToRight
Cells(5, place).Value = montharray(arraycount) & minsortmonth
Else
If range1 <> place Then
Range(Cells(5, range1), Cells(lastrow, range1)).Cut
Cells(5, place).Select
Selection.Insert Shift:=xlToRight
End If
End If
arraycount = arraycount + 1
place = place + 1
Loop
minsortmonth = minsortmonth + 1
Loop
End Sub
最佳答案
我建议更改您所做的逻辑并使用 Dictionary .
假设您的数据(列)最初排序如下:JAN09、FEB09、APR09...MAR00、MAY00、JUL00、...等。月份收集存在一些间隙并且您想填补缺失的月份。这是一个想法:
'Note: columns are initially sorted!
Sub CheckMonthSequence()
Dim dic As Dictionary
Dim element As Variant
Dim col As Integer, pos As Integer, rng As Range
Dim initialDate As Date, endDate As Date, sTmp As String
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("B5")
'define initial date as January of ...
sTmp = rng
sTmp = "01/01/" & "20" & Right(sTmp, 2)
initialDate = CDate(sTmp)
'define end date
sTmp = rng.End(xlToRight)
sTmp = Left(sTmp, 3) & "/01/" & "20" & Right(sTmp, 2)
endDate = CDate(sTmp)
'create new dictionary with collection of months
Set dic = GetMonthsAsDictionary(initialDate, endDate)
'define a range of columns to sort and update
col = 0
Do While rng.Offset(, col) <> ""
element = rng.Offset(, col)
If dic.Exists(element) Then
pos = dic.Item(element)
If pos > col Then
Do While col < pos
rng.Offset(, col).EntireColumn.Insert xlShiftToRight
'sometimes it loses the reference, so...
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("B5")
rng.Offset(, col) = GetKeyByIndex(dic, col)
col = col + 1
Loop
col = pos
End If
End If
col = col + 1
Loop
End Sub
'needs reference to MS Scripting Runtime
Function GetMonthsAsDictionary(ByVal StartingMonth As Date, EndMonth As Date) As Dictionary
Dim dic As Dictionary
Dim i As Integer, j As Integer
'create new dictionary
Set dic = New Dictionary
i = 0
j = DateDiff("M", StartingMonth, EndMonth)
For i = 0 To j
dic.Add UCase(Format(DateAdd("M", i, StartingMonth), "MMMyy")), i
Debug.Print UCase(Format(DateAdd("M", i, StartingMonth), "MMMyy")), i
Next
Set GetMonthsAsDictionary = dic
End Function
Function GetKeyByIndex(ByVal dic As Dictionary, ByVal ind As Integer) As String
Dim dic_Keys As Variant, element As Variant
dic_Keys = dic.keys
For Each element In dic_Keys
If dic.Item(element) = ind Then
Exit For
End If
Next
GetKeyByIndex = element
End Function
如您所见,上面的代码:
1) 创建包含月份和相应索引的字典。
2) 循环遍历列集合
3) 检查值是否对应于字典中的索引
4)必要时填写标题。
我知道,它并不完美,但这是一个很好的起点。
干杯
Maciej
[编辑]
使用您的逻辑,代码可能如下所示:
Option Explicit 'do not apply initialize variable without its declaration
Sub MonthFinder()
Dim montharray As Variant, rng As Range
Dim firstyear As Integer, lastyear As Integer, curryear As Integer
Dim curroffset As Integer, lastcol As Integer, currmonth As Integer
curroffset = 0
montharray = Array("JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC")
'start here:
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("B5")
'first year
firstyear = CInt(Right(rng, 2))
'fid last col
lastcol = rng.End(xlToRight).Column - rng.Column
'find last year
lastyear = CInt(Right(rng.Offset(ColumnOffset:=lastcol), 2))
For curryear = firstyear To lastyear
For currmonth = LBound(montharray) To UBound(montharray)
'if current month is equal to last month - exit for
If CStr(montharray(currmonth) & curryear) = CStr(rng.End(xlToRight)) Then Exit For
'month is proper - do nothing
If rng.Offset(ColumnOffset:=curroffset) = CStr(montharray(currmonth) & curryear) Then GoTo SkipMonth
'other cases
rng.Offset(ColumnOffset:=curroffset).EntireColumn.Insert xlShiftToRight
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("B5")
rng.Offset(ColumnOffset:=curroffset) = CStr(montharray(currmonth) & curryear)
SkipMonth:
curroffset = curroffset + 1
Next
Next
Set rng = Nothing
End Sub
干杯,
马切伊
关于vba - 需要按顺序写出月份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27705859/
我在一个本土 C++ 框架内工作,其中一个类间接连接到 libjpeg-8c.so(作为 Ubuntu 16.04 突触包获得)。我在我的应用程序上运行 valgrind,它最终会写出图像数据,如下所
上下文 我正在运行一个 Tomcat 8.5 服务器,前端有一个 Nginx 反向代理来终止 SSL 连接,启用更多压缩。 在 Tomcat 服务器上,我有一个正在运行的 Web 应用程序,其中包含一
我正在尝试让 grunt-jsdoc-plugin 正常工作,但遇到了一个小问题。在我的控制台中,我不断收到: Running "jsdoc:dist" (jsdoc) task Warning: C
我继承了一个在数据库中存储 zip 文件的旧应用程序,需要检索该文件。在 Firefox 中运行良好,我可以打开 zip 并且其中的每个文件都很好。当我在 IE7 中运行它时,出现以下错误。 Inte
我想创建一个能够写出平面 html 文件的 cms,因此不需要数据库参与。 这个想法是CMS将允许编辑和更新文件(用php编写,如果需要的话可以使用mysql数据库),然后将这些更改保存/写出到htm
我有一个 javascript 函数,当通过 javascript 添加 td 元素时,它可以在 onclick 上正常运行。删除按钮工作正常。但是当我使用 php 创建元素并单击“删除”时,我得到:
我正在使用 node-png 库制作 png,然后将其保存在本地目录中,但是当我重新打开它时,它说它不存在。我想读入数据并将其发送出去,或者只是让响应发送一个 带图片的字段。这是我到目前为止所拥有的:
我需要一个类似于此处解释的函数... JS function for writing out a word, binary counter style ...但使用基数 7(或其他)生成(计数)从 A
我使用 matplotlib.pyplot 创建了一个简单的 hexbin 图。我没有更改任何默认设置。我的 x 轴信息范围从 2003 到 2009,而 y 值范围从 15 到 35。matplot
这是我的代码的重要部分: int realnum, positive = 0, total, poscount; for (poscount = 1; poscount > realnum;
我正在尝试在 Julia 中读取和写入一个简单的数据集。数据集是 mtcars ,取自 R,任意添加一列 bt带有随机 bool 值。文件/文件夹结构(如下)是使用 R arrow 写出的。包裹。 文
我正在尝试将数据写入包含日语字符的 Excel 文件。我正在使用 codec.open() 来获取数据,这似乎工作正常,但是当我尝试写入数据时遇到了这个错误: UnicodeEncodeError:
我是一名优秀的程序员,十分优秀!