2017-11-01 22 views
0

自作VBAコードに問題があります。 makroは次の問題を解決するはずです:私は "cockpitfile"を使用します。2つの異なるExcelファイルから2つのワークシートのelemtsを2つの配列にロードする必要があります。これらの配列の要素は、互いに引き算する必要があります。私はこれらの2つの要素との違いを得たいと思います。例として:ArrayElm1(1,1) - ArrayElm2(1,1)= ArrayElm3(1,1)、ArrayElm1(1,2) - ArrayElm2(1,2)= ArrayElm3(1,2)等2つの多次元配列の減算VBA

最初の視点ではコードが機能しているようですが、計算機で結果をチェックすると要素の違いは間違っています。私のUboundはArray Aなので、UBoundに問題があるのでしょうか?

私を助けることができますように!

Sub Differenz1() 

Application.ScreenUpdating = False 
Application.Calculation = xlCalculationManual 

'Variabledefinition 
Dim i As Long 'Index 
Dim j As Long 'Index 
Dim k As Long 'Index 
Dim ArrayA As Variant 'Array 
Dim ArrayB As Variant 'Array 
Dim ArrayC(71, 25) As Variant 'Array 
Dim myFile1 As String 'Workbookname 
Dim myFile2 As String 'Workbookname 
Dim wb1 As String 'Workbookname 
Dim wb2 As String 'Workbookname 
Dim WS_Count1 As Integer 'Count Worksheets 
Dim WS_Count2 As Integer 'Count Worksheets 
Dim arrays1 As String 'Dimension 
Dim arrays2 As String 'Dimension 


'Change the actual path 

ChDrive "O:\" 
ChDir "O:..." 


myFile1 = Application.GetOpenFilename 
Workbooks.Open Filename:=myFile1, ReadOnly:=True, IgnoreReadOnlyRecommended:=True 
wb1 = ActiveWorkbook.Name 
WS_Count1 = ActiveWorkbook.Worksheets.Count 



myFile2 = Application.GetOpenFilename 
Workbooks.Open Filename:=myFile2, ReadOnly:=True, IgnoreReadOnlyRecommended:=True 
wb2 = ActiveWorkbook.Name 
WS_Count2 = ActiveWorkbook.Worksheets.Count 



For k = 1 To WS_Count1 

ArrayA = Workbooks(wb1).Worksheets(k).Range("F5:Y75").Value 
ArrayB = Workbooks(wb2).Worksheets(k).Range("F5:Y75").Value 
    For i = LBound(ArrayA, 1) To UBound(ArrayA, 1) 
     For j = LBound(ArrayA, 2) To UBound(ArrayA, 2) 
      If Not IsError(ArrayA(i, j)) And Not IsError(ArrayB(i, j)) Then ArrayC(i, j) = ArrayA(i, j) - ArrayB(i, j) 
     Next j 
    Next i 

    ThisWorkbook.Worksheets(k + 1).Range("F5:Y75").Value = ArrayC 

Next k 


Application.ScreenUpdating = True 
Application.Calculation = xlCalculationAutomatic 

End Sub 

答えて

0

あなたは、ほぼ右のそれを持っていましたが、問題は、あなたがこのコードは、減算のためにはThisWorkbookの新しいシートを作成し、あなたのprevious questionに基づいて、それがエラーをチェックし、実行ArrayC

をリセットしていなかったということでした減算両方の値は、数値


Option Explicit 

Public Sub Differenz2() 
    Const USED_RNG = "F5:Y75" 'Main range 
    Dim i As Long, j As Long, k As Long, file1 As String, file2 As String, ws1Count As Long 
    Dim wb1 As Workbook, wb2 As Workbook, arr1 As Variant, arr2 As Variant, arr3 As Variant 

    'ChDrive "O:\": ChDir "O:..." 
    file1 = Application.GetOpenFilename: If file1 = "False" Then Exit Sub 
    file2 = Application.GetOpenFilename: If file2 = "False" Then Exit Sub 
    Application.ScreenUpdating = False 
    Set wb1 = Workbooks.Open(Filename:=file1, ReadOnly:=True) 
    Set wb2 = Workbooks.Open(Filename:=file2, ReadOnly:=True) 
    ws1Count = wb1.Worksheets.Count 
    If ws1Count = wb2.Worksheets.Count Then 
     MakeNewWS ws1Count 'Remove this line if ThisWorkbook is properly setup 
     For k = 1 To ws1Count 
      arr1 = wb1.Worksheets(k).Range(USED_RNG).Value 
      arr2 = wb2.Worksheets(k).Range(USED_RNG).Value 
      ReDim arr3(1 To 71, 1 To 20) 'reset array, based on USED_RNG ("F5:Y75") 
      For i = LBound(arr1, 1) To UBound(arr1, 1) 
       For j = LBound(arr1, 2) To UBound(arr1, 2) 
        If Not IsError(arr1(i, j)) And Not IsError(arr2(i, j)) Then 
         If IsNumeric(arr1(i, j)) And IsNumeric(arr2(i, j)) Then 
          arr3(i, j) = arr1(i, j) - arr2(i, j) 
         End If 
        End If 
       Next 
      Next 
      ThisWorkbook.Worksheets(k + 1).Range(USED_RNG) = arr3 
     Next 
    End If 
    wb1.Close False: wb2.Close False: ThisWorkbook.Worksheets(2).Activate 
    Application.ScreenUpdating = True 
End Sub 

ある場合にのみ、

はThisWorkbookがシートも

の適切な数が含まれている場合はMakeNewWS()部分を無視することができ、アレイを使用してパフォーマンス(有意に)

+0

を改善んこれは、ファイル1のように用紙の同じ数を有していることを検証しますファイル2、それ以外の場合は実行されません。ファイル2にファイル1よりも多くのシートを含めることができますが、それ以下でない場合は、 'If ws1Count = wb2.Worksheets.Count Then'(およびそれに対応する' End If')の条件を削除してください。 –

+0

hello @Paul bica!私の遅い答えに申し訳ありません。今朝あなたの投稿を見て、コードは完璧に動作します!私を助けてくれてありがとうと、さらにsecondeコードと 'wb1.close False'を加えてくれてありがとう – mhmh

+0

arrayCの次元に問題があったと思った... – mhmh