试图在细胞内找到部分刺痛VBA

时间:2018-04-02 10:22:40

标签: excel vba excel-vba

所以一点介绍: 我有一张约15或16张的工作簿。这些数据是住在我酒店的人的日志,因此每张床单都以客人住宿的名称和年份(即2017年3月)命名,并有4列(客人姓名,入住日期,退房日期,房间)。 在另一张名为“Dados”的表格中,我有每位客人给我们的评论。现在,此评论数据通过用户表单通过用户插入。

我想做什么: 用户在表单中引入的每个评论,都会在月份表中查看来宾的信息。

我尝试运行Vlookup但失败了,因为我的问题是用户有时只会引入来宾的姓氏,并且在客人名称的单元格中我们会有类似“john Smith”的内容

我通过谷歌查看,发现这可能是通过“喜欢”命令完成的,但这并不是找到匹配。这是我目前编译的代码:

Option Explicit

Sub Data()
Dim ws As Worksheet
Dim wn As Worksheet
Dim sh As Worksheet
Dim shName As String
Dim cData As Variant
Dim sLastRow As Long, s As Long
Dim lLastRow As Long, j As Long
Dim LastRow As Long, i As Long
Set ws = ThisWorkbook.Worksheets("Dados")
Set wn = ThisWorkbook.Worksheets("List")


lLastRow = Cells(wn.Rows.Count, "D").End(xlUp).Row + 1

With ws
 LastRow = Cells(.Rows.Count, "A").End(xlUp).Row + 1

 For i = 1 To LastRow
    For j = 2 To lLastRow
        shName = wn.Cells(j, 4).Value
        Set sh = Worksheets(shName)
        sLastRow = Cells(sh.Rows.Count, "A").End(xlUp).Row + 1

        For s = 2 To sLastRow
            If sh.Cells(s, 1) Like "*" & .Cells(i, 1) & "*" Then cData = sh.Cells(s, 3)
            If IsDate(cData) = True Then Exit For
        Next s
        If IsDate(cData) = True Then Exit For
    Next j
 Next i
End With

End Sub

在工作表“列表”中,我有通过另一个子工作表生成的所有工作表的列表。 (因为它运行得很好所以我不会打扰你这个代码)这样​​我就可以将客人名称与所有表格进行比较。这个数字是:

 lLastRow = Cells(wn.Rows.Count, "D").End(xlUp).Row + 1

首先,我想为我的代码粗糙道歉,我一直在学习自己编写vba代码。其中大部分来自此处和其他网站的帖子。

如果你们中的任何一个人能帮助我完成这项工作,我很高兴。这样:

If sh.Cells(s, 1) Like "*" & .Cells(i, 1) & "*" Then cData = sh.Cells(s, 3)

没有让我在比赛中的任何地方。

处理代码所花费的时间也是巨大的,你可以想象,如果你们能够提供一种更简单的方法来实现这一目标,我将非常感激(我已经在互联网上无处不在,无处可寻找任何更简单的东西)

提前致谢, 佩德罗

3 个答案:

答案 0 :(得分:0)

您可以使用InStr函数在字符串中查找字符串。 InStr(1,sh.Cells(s,1),. Cell(i,1),1)。这将返回一个数值。

If InStr(1, UCase(sh.Cells(s, 1), UCase(.Cells(i, 1)) <> 0 Then cData = sh.Cells(s, 3)

答案 1 :(得分:0)

您的Like支票没问题

但您必须明确且正确地限定要引用的工作表对象

这样:

lLastRow = Cells(wn.Rows.Count, "D").End(xlUp).Row + 1

变为:

lLastRow = wn.Cells(wn.Rows.Count, "D").End(xlUp).row + 1

sLastRow = Cells(sh.Rows.Count, "A").End(xlUp).Row + 1

变为:

sLastRow = sh.Cells(sh.Rows.Count, "A").End(xlUp).row + 1

答案 2 :(得分:0)

我使用Instr和LCase进行字符串搜索。 LCase使搜索案例不敏感。

If InStr(1, LCase(sh.Cells(s, 1), LCase(.Cells(i, 1)) Then cData = sh.Cells(s, 3)