여기 Google에서 호스팅 정말 멋진 사랑하는 클래스있다 :Excel 매크로에서 JavaScript를 사용하려면 어떻게해야합니까?
http://code.google.com/p/google-diff-match-patch/
나는 몇 가지 웹 사이트에 전에 그것을 사용했지만, 지금은 텍스트를 비교하는 엑셀 매크로 내에서 그것을 를 사용할 필요가 두 세포 사이.
그러나 VBA가 아닌 JavaScript, Python, Java 및 C++에서만 사용할 수 있습니다.
내 사용자는 Excel 2003으로 제한되어 있으므로 순수한 .NET 솔루션이 작동하지 않습니다. 코드를 수동으로 VBA로 변환하는 것은 너무 많은 시간이 걸리고 업그레이드를 어렵게 만듭니다.
.NET 컴파일러 (JScript.NET 또는 J #)를 사용하여 JavaScript 또는 Java 소스를 컴파일하고 Reflector를 사용하여 VB.NET으로 출력 한 다음 VB.NET 코드를 수동으로 VBA로 다운 그레이드하는 옵션을 고려했습니다. 나에게 순수한 VBA 솔루션을 제공합니다. 모든 .NET 컴파일러로 컴파일 할 때 문제가 발생한 후이 경로를 포기했습니다.
내가 작동하는 .NET 라이브러리를 얻었다면, ExcelDna (http://www.codeplex.com/exceldna), 오픈 소스 Excel 추가 기능을 사용하여 .NET 코드 통합을 더 쉽게 할 수있었습니다.
마지막으로 Internet Explorer 개체를 호스팅하고 JavaScript 원본을 보내고 호출하는 것이 좋습니다. 내가 이것을 작동 시키더라도 내 추측은 더러움이 느리고 지저분 할 것입니다.
업데이트 : 해결책을 찾았습니다!
아래에 설명 된 WSC 방법을 허용 된 대답으로 사용했습니다. 나는 조금 차이점을 정리하고 배열의 VBA 호환 배열을 날 다시 제공하기 위해 WSC 코드를 변경했다 :
function DiffFast(text1, text2)
{
var d = dmp.diff_main(text1, text2, true);
dmp.diff_cleanupSemantic(d);
var dictionary = new ActiveXObject("Scripting.Dictionary"); // VBA-compatible array
for (var i = 0; i < d.length; i++) {
dictionary.add(i, JS2VBArray(d[i]));
}
return dictionary.Items();
}
function JS2VBArray(objJSArray)
{
var dictionary = new ActiveXObject("Scripting.Dictionary");
for (var i = 0; i < objJSArray.length; i++) {
dictionary.add(i, objJSArray[ i ]);
}
return dictionary.Items();
}
내가 WSC를 등록하고 그냥 괜찮 았는데. 다음과 같이 호출에 대한 VBA의 코드는 다음과 같습니다
Public Function GetDiffs(ByVal s1 As String, ByVal s2 As String) As Variant()
Dim objWMIService As Object
Dim objDiff As Object
Set objWMIService = GetObject("winmgmts:")
Set objDiff = CreateObject("Google.DiffMatchPath.WSC")
GetDiffs = objDiff.DiffFast(s1, s2)
Set objDiff = Nothing
Set objWMIService = Nothing
End Function
(나는 하나의 글로벌 objWMIService을 유지 노력하고 objDiff 주위에 내가 생성/각 셀이를 파괴 할 필요가 없습니다 것입니다, 그러나 보이지 않았다 성능에 차이를 만들 수 있습니다.)
그런 다음 내 주 매크로를 작성했습니다. 세 가지 매개 변수를 사용합니다 : 원래 값의 범위 (한 열), 새 값의 범위 및 diff가 결과를 덤프해야하는 범위. 모두 이 행의 동일한 번호를 갖는으로 가정하고 있습니다. 여기에 심각한 오류 검사가 없습니다.
Public Sub DiffAndFormat(ByRef OriginalRange As Range, ByRef NewRange As Range, ByRef DeltaRange As Range)
Dim idiff As Long
Dim thisDiff() As Variant
Dim diffop As String
Dim difftext As String
difftext = ""
Dim diffs() As Variant
Dim OriginalValue As String
Dim NewValue As String
Dim DeltaCell As Range
Dim row As Integer
Dim CalcMode As Integer
이 다음 세 줄
나중에 사용자가 선호하는 계산 모드를 서투르게 수선없이 업데이트를 속도 : Erase diffs
이를 :
Application.ScreenUpdating = False
CalcMode = Application.Calculation
Application.Calculation = xlCalculationManual
For row = 1 To OriginalRange.Rows.Count
difftext = ""
OriginalValue = OriginalRange.Cells(row, 1).Value
NewValue = NewRange.Cells(row, 1).Value
Set DeltaCell = DeltaRange.Cells(row, 1)
If OriginalValue = "" And NewValue = "" Then
이있는 경우, 중요하다, 이전의 차이점을 지우기 테스트는 내 사용자를위한 시각적 인 바로 가기이므로 전혀 변경 사항이 없을 때 명확합니다.
,텍스트, 동일했다 삽입 또는 삭제 여부, 델타 셀 값으로 함께 모든 텍스트를 결합 :
DeltaCell.value2 = difftext
Call FormatDiff(diffs, DeltaCell)
Next
Application.ScreenUpdating = True
Application.Calculation = CalcMode
End Sub
: diffs = GetDiffs(OriginalValue, NewValue)
For idiff = 0 To UBound(diffs)
thisDiff = diffs(idiff)
difftext = difftext & thisDiff(1)
Next
End If
당신은 값 을 설정해야 서식을 시작하기 전에
Public Sub FormatDiff(ByRef diffs() As Variant, ByVal cell As Range)
Dim idiff As Long
Dim thisDiff() As Variant
Dim diffop As String
Dim difftext As String
cell.Font.Strikethrough = False
cell.Font.ColorIndex = 0
cell.Font.Bold = False
If Not diffs Then Exit Sub
Dim lastlen As Long
Dim thislen As Long
lastlen = 1
For idiff = 0 To UBound(diffs)
thisDiff = diffs(idiff)
diffop = thisDiff(0)
thislen = Len(thisDiff(1))
Select Case diffop
Case -1
cell.Characters(lastlen, thislen).Font.Strikethrough = True
cell.Characters(lastlen, thislen).Font.ColorIndex = 16 ' Dark Gray http://www.microsoft.com/technet/scriptcenter/resources/officetips/mar05/tips0329.mspx
Case 1
cell.Characters(lastlen, thislen).Font.Bold = True
cell.Characters(lastlen, thislen).Font.ColorIndex = 32 ' Blue
End Select
lastlen = lastlen + thislen
Next
End Sub
: 다음은 차이점을 해석하고 델타 세포의 형식 코드입니다
최적화 할 수있는 기회가 있지만 지금까지는 문제가 없습니다. 도와 주신 모든 분들께 감사드립니다!
cool. 다행이 당신을 위해 일 했어. 미래에, 당신이 원한다면 당신은 당신 자신의 질문에 대답 할 수 있습니다. 파란색 텍스트 상자에 팝업됩니다. 시각적으로 당신이 게시했음을 분명히합니다. – Cheeso
Google diff/merge/patch 프로젝트에 (완전히 관리되는) C# 포트가 포함되었습니다. –