0

我正在尝试用字符串填充列 C 考虑是否行上的消费者符合条件之一:

如果消费者满足这些规则之一,则该值应设置为考虑: • 消费者只有 1 笔交易——(已完成) • 消费者有 2 - 4 笔交易,但总交易量 < 10,000 美元 ---(已完成) •消费者级别(基于以下规则)为 2 级或 3 级 ---(此信息位于 CV 和 CW 列上)如果下拉列表为 60 天且最大交易日期早于 30 天 • 如果下拉列表为 1 年且最长交易日期超过 90 天 • 如果下拉列表为 5 年且最大交易日期超过 180 天

'Interdction Review Tab, column C
Sheets("Interdiction Review").Columns(3).Font.Bold = True
Sheets("Interdiction Review").Columns(3).HorizontalAlignment = xlCenter
'Consumer has only 1 Transaction, the value on Interdiction Review Tab on Column C will be Consider
Dim wsStart As Worksheet, lastRow1 As Long, wsFinal As Worksheet
Dim dict As Object, rw As Range, v, v2, k, m, lin
Dim wsSSart As Worksheet
Dim dateDifference As Long
Dim SStartSelection As String
Dim isConsider As Boolean
Dim valid_col(1) As Integer
Dim lvl As Boolean
Set wsSSart = ActiveWorkbook.Sheets("SStart")
Set wsStart = ActiveWorkbook.Sheets("Start")
Set wsFinal = ActiveWorkbook.Sheets("Interdiction Review")
lastRow1 = wsStart.Cells(Cells.Rows.Count, "A").End(xlUp).Row
Set dict = CreateObject("Scripting.Dictionary")
SStartSelection = wsSSart.Cells(7, "A").Value
lvl = False
For Each rw In wsStart.Range("A2:AJ" & lastRow1).Rows
v = rw.Cells(8).Value
v2 = rw.Cells(36).Value
If Len(v) = 0 Or Len(v2) = 0 Then
v = rw.Cells(7).Value
v2 = rw.Cells(35).Value
End If
dict(v) = dict(v) + 1
dict(v2) = dict(v2) + 1
Next rw
For Each k In dict
isConsider = False
m = Application.Match(k, wsFinal.Columns(1), 0)
wsFinal.Cells(m, 7).FormulaArray = wsFinal.Cells(m, 7).Formula
dateDifference = DateDiff("D", wsFinal.Cells(m, 7).Value, Date)
If dict(k) = 1 Then
isConsider = True
ElseIf dict(k) >= 2 And dict(k) <= 4 And wsFinal.Cells(m, 6).Value <= 10000 Then
isConsider = True
End If
If StrComp(SStartSelection, "60 Days") = 0 And dateDifference > 30 Then
isConsider = True
ElseIf StrComp(SStartSelection, "1 Year") = 0 And dateDifference > 90 Then
isConsider = True
ElseIf StrComp(SStartSelection, "5 Years") = 0 And dateDifference > 180 Then
isConsider = True
End If
'Client number
If wsStart.Cells(2, 8) <> "" Then
valid_col(0) = 8
valid_col(1) = 36
Else
valid_col(0) = 7
valid_col(1) = 35
End If
'Level verification
For lin = 2 To lastRow1
If wsStart.Cells(lin, valid_col(0)) = k Then
If wsStart.Cells(lin, 100).Value = "Level 2" Or wsStart.Cells(lin, 100).Value = "Level 3" Then
lvl = True
Exit For
End If
End If
If wsStart.Cells(lin, valid_col(1)) = k Then
If wsStart.Cells(lin, 101).Value = "Level 2" Or wsStart.Cells(lin, 101).Value = "Level 3" Then
lvl = True
Exit For
End If
End If
Next lin
If isConsider And lvl Then
If Not IsError(m) Then wsFinal.Cells(m, 3).Value = "Consider"
End If
Next k
End Sub

似乎我的代码在错误的列中查找客户级别。例如:客户编号 3 位于 H 列,因此代码需要检查列 CV 以查看级别 客户编号 3 也位于列 AJ 代码需要检查列 CW 以查看级别。如果客户端位于两列上,并且 cod 需要检查两列以查找信息。

CV 列的级别是客户编号位于 H 列或/和 G 列时 CW 列的级别是客户位于 AJ 列或/和 AI 列时

我也在这里问过(你可以下载文件https://www.ozgrid.com/forum/index.php?thread/1228270-how-to-populate-a-column-with-a-string-taking -in-consideration-5-different-crite/&postID=1239894#post1239941

4

2 回答 2

1

唯一lvl设置为 False 的时间是在For Each k In dict循环发生之前。

因此,一旦在该循环中将特定行设置lvl为 True,随后的每一行也将设置lvl为 True,因为循环中没有任何内容可以设置lvl回 False。试试这个:

For Each k In dict
  isConsider = False
  lvl = False
于 2020-09-26T02:19:33.690 回答
1

你的代码太大了。我不认为你会得到你想要的答案,因为发现问题需要时间。因此,我将教你如何构建你的代码,以便能够讨论它的任何部分。请考虑下面的代码。

Sub NewTest()
    ' 093
    
    Dim WsIR As Worksheet
    
    Set WsIR = CreateWsIR()
    Worksheets("Start").Activate        ' probably not useful
End Sub

Private Function CreateWsIR() As Worksheet
    ' 093
    
    Dim Fun As Worksheet                ' = Function return object under preparation
    
    Set Fun = Worksheets.Add            ' Excel will make this the ActiveSheet
    With Fun
        .Name = "Interdiction Review"
        .Move After:=Worksheets("Start")
        ' format your sheet here
    End With
    
    Set CreateWsIR = Fun
End Function

看看这种结构的优点。

  1. 您的代码的前 30 多行被压缩成一行。
  2. 这使您可以在主要程序中清楚地发展您的叙述。
  3. 同时,与创建新工作表相关的所有内容都捆绑在一个单独的程序中,该程序易于测试、易于维护并且在需要时易于提问。

随着您继续创建项目的叙述,您将到达一个任务是填充列 C。使用上述方法,过滤和消除过程将发生在一个独立的函数中,就像CreateWsIR上面的函数是独立的一样。它将返回一个值,您将在主过程中将其插入到单元格中。在您目前的设置中,您甚至无法确定该操作发生的位置(我们也不能)。如果您更改结构以使其更加透明,您就不会有这样的问题,我们很乐意为您提供帮助。

于 2020-09-26T06:49:31.523 回答