В настоящее время я пытаюсь преобразовать функцию (для сравнения с String и проверить процент соответствия) с C# на VBA.Сравнение VBA String
C#:
public static double CompareStrings(string str1, string str2)
{
List<string> pairs1 = WordLetterPairs(str1.ToUpper());
List<string> pairs2 = WordLetterPairs(str2.ToUpper());
int intersection = 0;
int union = pairs1.Count + pairs2.Count;
for (int i = 0; i < pairs1.Count; i++)
{
for (int j = 0; j < pairs2.Count; j++)
{
if (pairs1[i] == pairs2[j])
{
intersection++;
pairs2.RemoveAt(j);//Must remove the match to prevent "GGGG" from appearing to match "GG" with 100% success
break;
}
}
}
return (2.0 * intersection)/union;
}
private static List<string> WordLetterPairs(string str)
{
List<string> AllPairs = new List<string>();
// Tokenize the string and put the tokens/words into an array
string[] Words = Regex.Split(str, @"\s");
// For each word
for (int w = 0; w < Words.Length; w++)
{
if (!string.IsNullOrEmpty(Words[w]))
{
// Find the pairs of characters
String[] PairsInWord = LetterPairs(Words[w]);
for (int p = 0; p < PairsInWord.Length; p++)
{
AllPairs.Add(PairsInWord[p]);
}
}
}
return AllPairs;
}
private static string[] LetterPairs(string str)
{
int numPairs = str.Length - 1;
string[] pairs = new string[numPairs];
for (int i = 0; i < numPairs; i++)
{
pairs[i] = str.Substring(i, 2);
}
return pairs;
}
Моих V Конверсия:
Option Explicit
Function CompareStrings(str1 As String, str2 As String)
Dim pairs1 As New Collection
Dim pairs2 As New Collection
pairs1 = WordLetterPairs(UCase(str1))
pairs2 = WordLetterPairs(UCase(str2))
Dim intersection, union, i, j As Integer
intersection = 0
union = pairs1.Count + pairs2.Count
For i = 0 To pairs1.Count
For j = 0 To pairs2.Count
If pairs1.Item(i) = pairs2.Item(i) Then
intersection = intersection + 1
pairs2.Remove (j)
Exit For
End If
Next j
Next i
CompareStrings = ((2 * intersection)/union)
End Function
Function WordLetterPairs(str As String)
Dim AllPairs As New Collection
Dim words() As String
words = SplitRe(str, "\s", True)
Dim w As Integer
For w = 0 To UBound(words)
If Len(Trim(words(w))) = 0 Then
Dim PairsInWord() As String
PairsInWord = LetterPairs(words(w))
For p = 0 To PairsInWord.Count
AllPairs.Add (PairsInWord(p))
Next p
End If
Next w
WordLetterPairs = AllPairs
End Function
Public Function SplitRe(text As String, pattern As String, Optional ignorecase As Boolean) As String()
Static re As Object
If re Is Nothing Then
Set re = CreateObject("VBScript.RegExp")
re.Global = True
re.MultiLine = True
End If
re.ignorecase = ignorecase
re.pattern = pattern
SplitRe = Strings.Split(re.Replace(text, vbNullChar), vbNullChar)
End Function
Public Function LetterPairs(ByVal str As String)
Dim numPairs, w As Integer
numPairs = Len(str) - 1
Dim pairs(numPairs) As String
For w = 0 To numPairs
pairs(w) = Mid(str, w, 2)
Next w
End Function
Sub Schaltfläche1_Klicken()
MsgBox (CompareStrings("LOL", "L"))
End Sub
Я получаю сообщение об ошибке в первой строке CompareStrings, "Параметр не является факультативным". Что я неправильно сделал?
Какая линия это происходит – litelite
pairs1 = WordLetterPairs (UCase (str1)) – Curunir
попробуйте изменить pairs1 = WordLetterPairs (UCase (str1)) Настройка pairs1 = WordLetterPairs (UCase (str1)). Вы должны использовать ключевое слово Set при назначении переменных объекта. – Jeremy