使用Instr函数查找带€单元格时因自定义格式导致的定位问题
问题分析与解决方案
嘿,你的问题核心在于单元格显示格式和实际存储值的区别!
你提到成本列用了自定义格式€0.00,这意味着单元格里实际存储的是纯数字(比如100、235),只是Excel把它显示成带€的样式。而你的代码里用InStr去查找单元格内容里的€符号,自然找不到——因为实际值里根本没有这个符号,最后循环只能一路往上,直到找到列标题(标题是文本型的,确实包含€)才停止。
下面给你两种靠谱的解决思路:
思路1:检查单元格的自定义格式
既然格式是€0.00,我们可以直接判断单元格的格式是否包含€,而不是去查单元格内容:
' 从初始的NewLastRowNumber开始往上找 Do While NewLastRowNumber >= 1 ' 检查单元格的数字格式是否包含€符号 If InStr(1, Cells(NewLastRowNumber, 10).NumberFormat, "€", vbTextCompare) > 0 Then ' 再额外确认这是数据行(避免误判标题行) If IsNumeric(Cells(NewLastRowNumber, 10).Value) Then Exit Do End If End If NewLastRowNumber = NewLastRowNumber - 1 Loop ' 循环结束后,NewLastRowNumber就是最后一个带€格式的数字单元格
思路2:直接找成本列最后一个有数字值的单元格
其实成本列存储的是数字,我们可以直接定位该列最后一个非空的数字单元格,这比找符号更高效:
' 定位第10列(J列)最后一个有数字值的单元格 Dim lastDataRow As Long lastDataRow = Cells(Rows.Count, 10).End(xlUp).Row ' 额外验证:如果担心标题行也被算进去,可以加个判断(假设标题在第1行) Do While lastDataRow > 1 And Not IsNumeric(Cells(lastDataRow, 10).Value) lastDataRow = lastDataRow - 1 Loop NewLastRowNumber = lastDataRow
这个方法更简洁,也避免了格式判断的潜在问题——毕竟只要是成本数据,肯定是数字,直接找最后一个数字单元格就准了。
另外,你原来的循环写了For a = 1 To 400,用Do While循环会更灵活,不用限制固定次数,直到找到目标就停止。
内容的提问来源于stack exchange,提问作者CptGoodar
相关产品推荐
相关产品推荐

