#excel #if-statement
#excel #if-statement
Вопрос:
If InStr(1, UCase(CStr(compare_DU_ID)), "L4L", 1) >= 1 Then
If UCase(CStr(compare_DU_ID)) = UCase(CStr(DU_ID)) Then 'If L4L in compare_DU_ID, then DU_ID definitely equals to compare_DU_ID
Worksheets("Sheet2").Cells(y, 97).Value = Updated_Date '1. Cells(y, 97) might need to change, depending on which contract date you want to update
End If
ElseIf InStr(1, CStr(compare_DU_ID), CStr(DU_ID), 1) = 1 Then
Worksheets("Sheet2").Cells(y, 97).Value = Updated_Date
ElseIf InStr(1, CStr(DU_ID), CStr(compare_DU_ID), 1) = 1 Then
Worksheets("Sheet2").Cells(y, 97).Value = Updated_Date
End If
У меня проблема с обновлением даты. Например, 1-й сценарий, если CStr(DU_ID) = 1731WG
и CStr(compare_DU_ID) = 31731WG
, то дата не будет обновляться. 2-й сценарий, когда CStr(DU_ID) = 1392WG
и CStr(compare_DU_ID) = 11392WG
, дата будет обновлена.
Что мне нужно изменить в коде, чтобы второй сценарий также не был изменен.
Кроме того, я серьезно думаю, что 11392WG будет обновлен, потому что он начинается с «1», как и 1392WG. И 31731WG не будет изменен, потому что он не начинается с «1», что является первым значением 1731WG.
Комментарии:
1. похоже, просто
If compare_DU_ID = DU_ID Or compare_DU_ID = Left(DU_ID) amp; DU_ID Then
2. Я предлагаю установить временные переменные
str1 = UCase(CStr(compare_DU_ID))
, аstr2 = UCase(CStr(DU_ID))
затем переписать ваш пример. При программировании соблюдайте принцип «DRY» (не повторяйтесь). Это делает ваш код более чистым, а в большинстве случаев и быстрее, в идеале дайте вашим временным переменным также несколько значимых имен… Это не ответ на вашу конкретную проблему, а скорее общий совет. На самом деле это, вероятно, самое важное руководство / правило программирования вообще.3. @Slai Я думаю, что проблема возникает из-за того, что во 2-м сценарии
11392WG
начинается с «1», что является 1-м значением1392WG
4. @V.K. Спасибо за ваше предложение. Я спешу писать код на этом новом языке, но я буду иметь это в виду.
5. @JimmyHuang
Left("1392WG") amp; "1392WG"
часть в моем примере приводит к"11392WG"
Ответ №1:
Вы используете эту версию функции
Public Shared Function InStr(_
ByVal Start As Integer, _
ByVal String1 As String, _
ByVal String2 As String, _
Optional ByVal Compare As Microsoft.VisualBasic.CompareMethod _
) As Integer
Это нормально, просто обратите внимание, что вы можете сказать вместо 1 в конце вашей функции VbCompareMethod.vbTextCompare
или вообще ничего.
Я думаю, проблема в том, что вы ожидаете, что он будет равен 1 вместо >= 1.
If InStr(1, UCase(CStr(compare_DU_ID)), "L4L", 1) >= 1 Then
If UCase(CStr(compare_DU_ID)) = UCase(CStr(DU_ID)) Then 'If L4L in compare_DU_ID, then DU_ID definitely equals to compare_DU_ID
Worksheets("Sheet2").Cells(y, 97).Value = Updated_Date '1. Cells(y, 97) might need to change, depending on which contract date you want to update
End If
ElseIf InStr(1, CStr(compare_DU_ID), CStr(DU_ID), 1) < 1 Then
Worksheets("Sheet2").Cells(y, 97).Value = Updated_Date
ElseIf InStr(1, CStr(DU_ID), CStr(compare_DU_ID), 1) < 1 Then
Worksheets("Sheet2").Cells(y, 97).Value = Updated_Date
End If
Попробуйте это и, пожалуйста, обратите внимание, я изменил отступ и =1
>=1
на в строках 4 и 6
Комментарии:
1. Они не используют эту версию функции. Они используют VBA. Также неясно, почему вы заменяете
=
на>=
. Возможно, вы правы, но мне кажется, что OP пытался выразить «если начинается с».2. @GSerg msdn.microsoft.com/en-us/library/8460tsh1 (v= против 90).aspx . В соответствии с Microsoft существует 2 версии InStr. Я никогда не говорил, что они НЕ используют VBA, что подразумевало это для вас?
3. InStr возвращает индекс совпадения, совпадение находится на уровне 2. Если InStr не имеет соответствия, он возвращает либо 0, либо -1.
4. То есть VB.NET . OP использует VBA , потому что вопрос помечен
excel
.5.
InStr(1, "1731WG", "1731WGxxxx", 1) = 0
,InStr(1, "1731WGxxxx", "1731WG", 1) = 1
. Чтобы получить обновленную информацию о любом из них, это то, что вы изначально опубликовали, я думаю, вам нужно проверить свои входные данные ; Используйте свой исходный код и предложение @V.K.str1 = UCase(DU_ID)
иstr2=UCase(compare_DU_ID)
и выполните пошаговый код с помощью F8. Убедитесь, что str1 и str2 соответствуют ожидаемым. Вы также можете сделатьint1 = instr(1, str1, str2, 1)
иint2 = instr(1, str2, str1, 1)
получить еще лучшую информацию.