excel - VBA 的新功能 :)
问题描述
我需要您对我几天前制作的 VBA 代码的帮助,但我无法使其工作。总而言之,我有一个“export.prn”文件,我需要从中提取数据以将其复制到特定工作表中的另一个 Excel 文件中。当我的数据在一行中时,我必须复制这一行并将其转换为另一张工作表中的一列。然后,在这一列(最后一列)上,我只需要对非空白单元格应用一个公式(除了那些说“Uncalib”的单元格),以便新值替换旧值。然后,对于每个带有公式的单元格(非空白单元格),我需要在右侧的单元格中显示其绝对值(例如:C1=-21;D1=21)。最后,对于最后一列(带有绝对值),我必须应用条件格式规则。所以,最后,我有 2 列(CF 的非绝对和绝对),开始时为空白的单元格最后仍为空白。此外,每次运行此代码时,数据都需要位于下一行/列中,这样它就不会删除以前的数据(因此每次运行都会在 Sheet1 中创建 1 行,在 Sheet2 中创建 2 列)
我是 VBA 的新手,并试图做一些事情,但它似乎不能正常工作,尤其是最后的行:
If WsZscore.Cells(i, LastCol).Value = "" Then
而且我不知道为什么(因为我对这类东西的了解有限^^ )。我的代码对于我想要做的事情来说可能太长了,但我没有设法让它更短:/
谢谢 :)
Sub TM()
Application.ScreenUpdating = False
Réponse = MsgBox("Voulez vous importer les données ?", vbYesNo)
If Réponse <> vbYes Then Exit Sub
Dim i As Long
Dim j As Long
Dim l As Long
Dim WsCartes As Worksheet
Dim WsDonnées As Worksheet
Dim WsOrigine As Worksheet
'Set my workbooks and sheets
Set WsCartes = Workbooks("Classeur1.xlsm").Worksheets("cartes")
Set WsDonnées = Workbooks("Classeur1.xlsm").Worksheets("TM")
Set WsOrigine = Workbooks("export2.prn").Worksheets("export2")
Set WsZscore = Workbooks("Classeur1.xlsm").Worksheets("ZscoreTM")
i = 2
l = 4
WsCartes.Range("D5").Value = WsOrigine.Range("J4").Value
'Import my data from the export.prn file
While WsOrigine.Cells(l, 2).Value <> ""
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Be9*" Then
While (WsDonnées.Range("A" & i).Value <> "")
i = i + 1
Wend
WsDonnées.Range("A" & i).Value = WsOrigine.Range("J4").Value
WsDonnées.Range("B" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("A" & i).Copy
WsDonnées.Range("A" & i).PasteSpecial (xlPasteValues)
WsDonnées.Range("B" & i).Copy
WsDonnées.Range("B" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "B11*" Then
WsDonnées.Range("C" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("C" & i).Copy
WsDonnées.Range("C" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Al27*" Then
WsDonnées.Range("D" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("D" & i).Copy
WsDonnées.Range("D" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Cr52*" Then
WsDonnées.Range("E" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("E" & i).Copy
WsDonnées.Range("E" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Mn55*" Then
WsDonnées.Range("F" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("F" & i).Copy
WsDonnées.Range("F" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Fe56*" Then
WsDonnées.Range("G" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("G" & i).Copy
WsDonnées.Range("G" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Co59*" Then
WsDonnées.Range("H" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("H" & i).Copy
WsDonnées.Range("H" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Ni60*" Then
WsDonnées.Range("I" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("I" & i).Copy
WsDonnées.Range("I" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Cu65*" Then
WsDonnées.Range("J" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("J" & i).Copy
WsDonnées.Range("J" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Zn66*" Then
WsDonnées.Range("K" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("K" & i).Copy
WsDonnées.Range("K" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "As75*" Then
WsDonnées.Range("L" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("L" & i).Copy
WsDonnées.Range("L" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Mo98*" Then
WsDonnées.Range("M" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("M" & i).Copy
WsDonnées.Range("M" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Cd114*" Then
WsDonnées.Range("N" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("N" & i).Copy
WsDonnées.Range("N" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Sn118*" Then
WsDonnées.Range("O" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("O" & i).Copy
WsDonnées.Range("O" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Sb121*" Then
WsDonnées.Range("P" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("P" & i).Copy
WsDonnées.Range("P" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Ba137*" Then
WsDonnées.Range("Q" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("Q" & i).Copy
WsDonnées.Range("Q" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Pb...*" Then
WsDonnées.Range("R" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("R" & i).Copy
WsDonnées.Range("R" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "U238*" Then
WsDonnées.Range("S" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("S" & i).Copy
WsDonnées.Range("S" & i).PasteSpecial (xlPasteValues)
End If
If WsOrigine.Cells(l, 1).Value = "TM-24.4" And WsOrigine.Cells(l, 3).Value = "Se78*" Then
WsDonnées.Range("T" & i).Value = WsOrigine.Cells(l, 7).Value
WsDonnées.Range("T" & i).Copy
WsDonnées.Range("T" & i).PasteSpecial (xlPasteValues)
End If
l = l + 1
Wend
'Define the LastRow/LastCol
LastRow = WsDonnées.Cells(Rows.Count, "A").End(xlUp).Row
LastRow2 = WsZscore.Cells(Rows.Count, "A").End(xlUp).Row
LastCol = WsZscore.Cells(3, Columns.Count).End(xlToLeft).Column
'Copy the last row from Sheet1 and transpose it to the last empty column in Sheet2
WsDonnées.Cells(LastRow, 1).EntireRow.Copy
WsZscore.Cells(2, LastCol + 1).PasteSpecial Transpose:=True
'If a cell display Uncalib, display nothing
For i = 3 To LastRow2
If WsZscore.Cells(i, LastCol + 1).Value = "Uncalib" Then
WsZscore.Cells(i, LastCol + 1).Value = ""
End If
Next i
'Apply the formula to the values expect for the blank ones
LastCol = WsZscore.Cells(3, Columns.Count).End(xlToLeft).Column
For i = 3 To LastRow2
If WsZscore.Cells(i, LastCol).Value = "" Then
WsZscore.Cells(i, LastCol + 1).Value = ""
Else
WsZscore.Cells(i, LastCol + 1).Formula = "=(RC[-1]-RC2)/(RC3/2)"
End If
Next i
LastCol = WsZscore.Cells(3, Columns.Count).End(xlToLeft).Column
WsZscore.Cells(2, LastCol).EntireColumn.Copy
WsZscore.Cells(2, LastCol - 1).EntireColumn.PasteSpecial xlPasteValues
WsZscore.Cells(2, LastCol).EntireColumn.Delete
'Apply the absolute formula to the non-empty cells and display the result in the cell to the right
LastCol = WsZscore.Cells(3, Columns.Count).End(xlToLeft).Column
For i = 3 To LastRow2
WsZscore.Cells(i, LastCol + 1).Formula = "=ABS(RC[-1])"
WsZscore.Cells(i, LastCol + 1).Value = WsZscore.Cells(i, LastCol + 1).Value
'Set my conditional formatting rules
Set iset = WsZscore.Cells(i, LastCol + 1).FormatConditions.AddIconSetCondition
'select the traffic lights iconset
With iset
.IconSet = ActiveWorkbook.IconSets(xl3Symbols)
.ReverseOrder = True
.ShowIconOnly = True
End With
'specify amber traffic light for values >= 80% of target(2500)
With iset.IconCriteria(2)
.Type = xlConditionValueNumber
.Operator = xlGreaterEqual
.Value = "=2"
End With
'specify green traffic light for values >= the target(2500)
With iset.IconCriteria(3)
.Type = xlConditionValueNumber
.Operator = xlGreaterEqual
.Value = "=3"
End With
WsZscore.Cells(i, LastCol).NumberFormat = "0.00"
Next i
'Display nothing and delete CF if the cell is blank
For i = 3 To LastRow2
If WsZscore.Cells(i, LastCol).Value = "" Then
WsZscore.Cells(i, LastCol + 1).FormatConditions.Delete
WsZscore.Cells(i, LastCol + 1).Value = ""
End If
Next i
WsZscore.Cells(2, LastCol).Value = WsDonnées.Cells(LastRow, 1).Value
WsZscore.Cells(2, LastCol).Font.Bold = True
Application.ScreenUpdating = True
End Sub
````
解决方案
推荐阅读
- flutter - 未处理的异常:对空值使用空检查运算符
- go - 如何使用 Cobra 和 Viper 将值绑定为配置中数组的第一项?
- three.js - Webgl/Three.js 抗锯齿问题
- sql-server - 尝试创建主密钥时出现“服务主密钥解密期间发生错误”
- java - ObjectAid:未处理的事件循环异常
- redis - Redis 或 DynamoDB 用于计数的短期条目?
- html - 将日期和时间添加到隐藏的输入值
- vba - 如何在 VBA 中的某个时间暂停应用程序
- caching - Live555添加缓存,播放更流畅
- google-chrome - Chrome 浏览器无限控制台记录 MessageEvent