Excel2011 VBA修剪字符串,隐形字符数据透视表
问题描述:
我是您的社区的新用户,我的名字是Thomas。 我以前是VisualFoxPro开发人员,但现在我试图学习如何处理Excel(2011在Mac上)和VBA。只在我的业余时间;-)。 自从我创业以来,我搜索了很多,经常在这里找到答案,所以我来了。 (几乎)全部图片: 我从HTML文件(桥竞赛结果)中删除数据,在某些点(行)有固定的列数据,一列包含2个由“ - ”分隔的球员名字, 。 我没有问题来检索第一个,但不能修剪第二个。 我都试过了,TRIM,CLEAN,SUBSTITUE所有CHAR - > 31和CHAR 127,129,141,143,144和157 我甚至尝试这个,发现某处在谷歌:Excel2011 VBA修剪字符串,隐形字符数据透视表
Sub Clean_and_Trim_Cells()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Dim s As String
For Each c In ActiveSheet.UsedRange
s = c.Value
If Trim(Application.Clean(s)) <> s Then
s = Trim(Application.Clean(s))
c.Value = s
End If
Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
所以,对于同一名球员来说,我会得到不同长度的字符串,一个被正确修剪,另一个更长。 我不明白。
这里是我如何定义列的长度和提取名称。
Sub PieceOfCode
If Left(Trim(cDataString), 4) = "Rang" Then ‘Header row
'Here we define the columns width and initiate data collection
nScore = 0
cTeamName = ""
cTeam = ""
cP1 = ""
cP2 = ""
nCol1 = InStr(cDataString, "Rang")
nCol2 = InStr(cDataString, "Paire")
nCol3 = InStr(cDataString, "Score")
nCol4 = InStr(cDataString, "Nom")
nCol5 = InStr(cDataString, "Equipe")
nCol1Length = nCol2 - 1
nCol2Length = nCol3 - nCol2
nCol3Length = nCol4 - nCol3
nCol4Length = nCol5 - nCol4
nCol5Length = Len(cDataString) - nCol5 + 1
'And further in the process...
nScore = Val(Mid(Replace(cDataString, ",", "."), nCol3, nCol3Length))
cNamesString = Mid(cDataString, nCol4, nCol5 - nCol4)
nSplitTeamNamesPos = InStr(cNamesString, " - ")
cP1 = Trim(Mid(cNamesString, 1, nSplitTeamNamesPos - 1))
cP2 = Trim(Mid(cNamesString, nSplitTeamNamesPos + 3))
End If
End Sub
当我用这个建立数据透视表时,我得到了同一个玩家的2个条目。
这里的代码,我必须创建数据透视表,我承认,在录音机的帮助下,但即使这就是为什么,我会知道如何修剪我的字符串。
Sub CreatePivotTable()
Dim nRowCount As Integer
Dim cRowCount As String
Sheets("Data").Select
Range("A1").Select
nRowCount = GetRowCount("Data")
cRowCount = Trim(CStr(nRowCount))
Range("A1:B" & cRowCount).Select
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"Data!R1C1:R" & cRowCount & "C2", Version:=xlPivotTableVersion14).CreatePivotTable _
TableDestination:="TempPvt!R1C1", TableName:="PivotTable8", DefaultVersion _
:=xlPivotTableVersion14
Sheets("TempPvt").Select
Cells(3, 1).Select
With ActiveSheet.PivotTables("PivotTable8").PivotFields("Nom")
.Orientation = xlRowField
.Position = 1
End With
ActiveSheet.PivotTables("PivotTable8").AddDataField ActiveSheet.PivotTables(_
"PivotTable8").PivotFields("Score"), "Total", xlSum
ActiveSheet.PivotTables("PivotTable8").AddDataField ActiveSheet.PivotTables(_
"PivotTable8").PivotFields("Score"), "Sum of Score2", xlSum
ExecuteExcel4Macro _
"PIVOT.FIELD.PROPERTIES(""PivotTable8"",""Sum of Score2"",""# Tours"",,4)"
ActiveSheet.PivotTables("PivotTable8").AddDataField ActiveSheet.PivotTables(_
"PivotTable8").PivotFields("Score"), "Sum of Score2", xlSum
ExecuteExcel4Macro _
"PIVOT.FIELD.PROPERTIES(""PivotTable8"",""Sum of Score2"",""Moyenne"",,8)"
End Sub
最后这里是两个字符串与测试头(BAPTISTE克劳德是目标)。
穰帕尔雷分数喃队报
302 1,83夫人NIMSGERN莫妮克 - BAPTISTE克劳德夫人EMERIQUE
穰帕尔雷分数喃队报
8 101 0.92 BAPTISTE克劳德 - 夫人NIMSGERN莫妮克夫人EMERIQUE
就是这样。
答
2种方式来提取名称
1.
nSplitTeamNamesPos = InStr(cNamesString, " - ")
cP1 = Trim(Mid(cNamesString, 1, nSplitTeamNamesPos - 1))
cP2 = Trim(Mid(cNamesString, nSplitTeamNamesPos + 3))
2.
nSplitTeamNamesPos = Split(cNamesString, " - ")
cP1 = Trim(nSplitTeamNamesPos(0))
cP2 = Trim(nSplitTeamNamesPos(1))
(DIM nSplitTeamNamesPos作为字符串()或变体)
当修整所述第二名称,
VBA的修剪仅适用于前导和尾随空字符。如果字符串中有任何内容,则需要工作表functionfunction.trim – Raystafarian
感谢您的及时答复,但这并不能解决我的问题。第四栏的长度是53个字,我仍然无法摆脱第二个名字的最后一个字母后留下的内容。我会找到另一种方式,但这让我很困扰。 – LeKibbitz
一旦你得到'cNamesString',你可以使用'Split(cNamesString,“ - ”)'然后修剪两个项目 –