RICVBA 发表于 2015-2-15 08:59:17

搜索复杂性

您好,我正在尝试在不同的excel文件中收集信息
我注意到excel vba在搜索两个相似的单词时总是遇到困难
这些词是;ZK0704706800“;和“;ZK0704707800“;正如你们所见,只有一个数字彼此不同
在许多情况下,excel vba将这些单词视为相同的
这对VBA来说应该不是一项艰巨的任务,你对此有什么想法吗
提前谢谢。

RICVBA 发表于 2015-2-15 10:06:27

使用“;查找“;“方法”;“范围”;对象
我做了一个简单的测试,把这两个;文字“;在不同的单元格中(单独或在其他字符中),并始终成功识别它们,例如Dim c As Range
Set c = Range("b2:b100").Find("ZK0704706800", LookIn:=xlValues)如果它不适合您,请提供有关您的案例环境的更多详细信息

RICVBA 发表于 2015-2-15 10:30:50

我使用的代码下方的回复配对Thx;Option Explicit
Sub Ayliksiparidene()
Dim a1、a2、a8、a20作为变量
Dim a5、a9、a19、a23、a21、a22、a24作为整数
Dim Rng作为范围
Application。屏幕更新=假范围(第(2)页)。单元格(3、9)、活页(2)。单元格(32,20))。ClearContents a1=ActiveWorkbook。名称(1)。激活a2=Sheets(1)。单元格(1,2)
工作簿。打开a2=ActiveWorkbook。名称a5=32*******************Ayl和305;k bazda模型siparisi hesaplanmas#305
;对于a19=3至a5#039;程序excelinde模型ismi iceren sutunun son dolu sat#305;r努马拉斯#305
;工作簿(a1)。激活;表(2)。激活;a20=薄板(2)。单元格(a19,1)'aranacak模型ismi;a23=0'ayl和305;k siparis adedi s#305;f#305;rland#305
 对于a21=2至a9#039;预测te模型isminin oldugu sat#305;rlar&nbsp 工作簿(a8)。激活'预测excelini aktive et&nbsp 表(1)。激活&nbsp If板材(1)。单元格(a21,1)=a20,然后&nbsp&nbsp 对于a22=4到15&nbsp&nbsp a23=0&nbsp&nbsp 工作簿(a8)。激活#039;预测excelini aktive et&nbsp&nbsp 表(1)。激活&nbsp&nbsp a23=薄板(1)。单元格(a21、a22)&039;型号bas#305;na her ay#305;n siparis adedi&nbsp&nbsp 工作簿(a1)。激活&nbsp&nbsp 表(2)。激活&nbsp&nbsp 设置Rng=范围(“h:h”)。查找(what:=a20,lookat:=xlWhole,LookIn:=xlValues)&nbsp&nbsp a24=Rng。行&nbsp&nbsp 表(2)。单元格(a24,a22+5)=页(2)。细胞(a24,a22+5)+a23&nbsp&nbsp 下一个a22&nbsp 否则:如果结束 下一个a21;下一个a19************************************************************
;工作簿(a1)。激活;表(2)。激活End Sub,正如您所看到的,我正在使用range find方法,但它仍然不起作用。我尝试删除其中一个的最后2位,现在它起作用了
因此这两个单词之间的差异比之前大得多,但这不是一个精确解://p>

RICVBA 发表于 2015-2-16 04:40:15

我试着阅读了你的代码,但使用了两本阅读你的代码编写的试用工作簿,效果很好。如果你'd张贴你的作业本,看看是什么#039;除此之外,您可能需要考虑以下提示,以大大加快代码速度:
-;激活;方法
-;查找“;“两者都不包括在内”;对于a22=4到15“;和“;对于a21=2到a9“;循环,因为它只取决于;a19“;最外层的循环变量对于上面的内容,我修改了您的代码,如下所示Option Explicit
Sub AylikSiparisDene()
Dim a20 As Variant
Dim a5, a9, a19, a23, a21, a22, a24 As Integer
Dim Rng As Range
Dim Wb01Sh01 As Worksheet, Wb01Sh02 As Worksheet, Wb02Sh01 As Worksheet
Application.ScreenUpdating = False
Set Wb01Sh01 = ActiveWorkbook.Sheets(1) 'sheet from where to read "forecast excelini" workbook name
Set Wb01Sh02 = ActiveWorkbook.Sheets(2) 'working sheet in main workbook
Wb01Sh02.Range(Cells(3, 9), Cells(32, 20)).ClearContents
Workbooks.Open Wb01Sh01.Cells(1, 2)
Set Wb02Sh01 = ActiveWorkbook.Sheets(1) 'forecast excelini
a5 = 32
a9 = 41
'*******************Aylik bazda model siparisi hesaplanmasi
For a19 = 3 To a5 'program excelinde model ismi iceren sutunun son dolu satir numarasi
    With Wb01Sh02
      a20 = .Cells(a19, 1) 'aranacak model ismi
      Set Rng = .Range("h:h").Find(what:=a20, lookat:=xlWhole, LookIn:=xlValues)
    End With
    a24 = Rng.Row
    a23 = 0 'aylik siparis adedi sifirlandi
    For a21 = 2 To a9 'forecast te model isminin oldugu satirlar
      With Wb02Sh01
            If .Cells(a21, 1) = a20 Then
                For a22 = 4 To 15
                  a23 = .Cells(a21, a22) 'model basina her ayin siparis adedi
                  Wb01Sh02.Cells(a24, a22 + 5) = Wb01Sh02.Cells(a24, a22 + 5) + a23
                Next a22
            Else: End If
      End With
    Next a21
Next a19
'************************************************************
Wb01Sh02.Activate
Application.ScreenUpdating = True
End Sub 在这里,我使用工作表变量来避免;激活;方法调用并使代码更具可读性(当然,您可以根据需要更改sheets变量名。)

RICVBA 发表于 2015-2-18 14:27:28

哇,ric,我在考虑改变这个激活程序,你带来了这个解决方案
这对我来说是个幸运的一天,也是thx。寻找建议
只要我有能力,我会给其他人发张干杯。
页: [1]
查看完整版本: 搜索复杂性