2016-09-20 2 views
0

Ich bin neu in Excel VBA und ich möchte den Abstand zwischen zwei Atomen berechnen und eine Schleife machen es für alle FälleKann nicht Schleife auf Excel VBA machen und Druckergebnisse

wollte

mit Koordinate B zu berechnen (i), C (i), D (i) in der Excel-Tabelle entsprechen x, y, z kartesischen Koordinaten ..

Diese Atome befinden sich: Einer in einer Reihe (i) und der andere in einer Reihe (i + 5)

Ich schreibe diesen Algorithmus, aber ich kann es nicht übertragen, um VBA

zu übertreffen
For i=4 to 1000 
    For j=9 to 1000 

    d=SQRT(POWER(B(i)-B(j),2)+ POWER(C(i)-C(j),2)+ POWER(D(i)-D(j),2)) 

    print **d** in (P(i)) #want to print the distance **d** in a case 
    j=j+4 # **j** is a multiple of 4 
    i=i+4 # **i** is a multiple of 4 

next i 

Danke, das ist meine erste Frage

+1

Sie bedeuten 'Debug.Print' zum sofortigen Fenster? oder 'MsgBox'? –

+0

Sie haben also 997 Atome und wollen den Abstand jedes der ersten 992 Atome mit dem Atom, das 5 Atome vorwärts ist, berechnen? Mit "B (i)" meinst du das i-te Element der Spalte B? Was willst du mit diesen Distanzen machen? Dump sie zu Spalte E? –

+0

ja ich möchte sie in Spalte E – tatitechno

Antwort

1

Ich denke, dass die folgenden sollte für Sie arbeiten:

Sub FindDistances() 
    Dim i As Long, j As Long 
    Dim r As Long, c As Long 'row and column indices for output 
    Dim data As Variant 

    Application.ScreenUpdating = False 'useful when doing a lot of writing 

    data = Range("B4:D1000").Value 'data is a 1-based array 

    c = 5 'column E 

    For i = 1 To UBound(data) - 5 Step 4 
     r = 1 'first row printed in -- adjust if need be 
     For j = i + 5 To UBound(data) Step 4 
      Cells(r, c).Value = Sqr((data(i, 1) - data(j, 1))^2 + (data(i, 2) - data(j, 2))^2 + (data(i, 3) - data(j, 3))^2) 
      r = r + 1 
     Next j 
     c = c + 1 
    Next i 

    Application.ScreenUpdating = True 
End Sub 
+0

Wow, das ist genau was ich will. Ich berechne die Möglichkeit, dass ein Atom eine Verbindung mit dem Rest herstellt ... die Entfernung sollte in einem Bereich von 1,1-1,4 liegen ... Ich weiß, dass ich das Gegenteil auch berechnen muss ... das letzte mit dem Rest zum Beispiel ... Ich werde es regeln ... Vielen Dank .. Ich warte seit Monaten auf meinen Kollegen, der seine Aufgabe erledigt - diese Aufgabe - – tatitechno

0

So etwas wie das? In VBA beziehen Sie sich auf Zellen wie Cells(row, column). Daten sollen sich in einem Arbeitsblatt mit der Bezeichnung Sheet1 befinden. Ich berechne jede Dimension separat (d1, d2, d3) nur für das Lesen der Einfachheit. Sie können diese vier Zeilen in einem zusammenführen, wenn Sie möchten. EDIT: Lesen Sie Ihre Kommentare oben, füge ich eine verschachtelte Schleife (j).

Sub Distances() 
    Dim i As Integer 
    Dim j As Integer 
    Dim d1 As Double, d2 As Double, d3 As Double, d As Double 

    For i = 4 To 1000 Step 4 'Can't understand your data, but Step 4 tries to account for your j=j+4 and i=i+4 
     For j = 9 To 1000 Step 4 
      d1 = (Worksheets("Sheet1").Cells(i, 2) - Worksheets("Sheet1").Cells(j, 2))^2 
      d2 = (Worksheets("Sheet1").Cells(i, 3) - Worksheets("Sheet1").Cells(j, 3))^2 
      d3 = (Worksheets("Sheet1").Cells(i, 4) - Worksheets("Sheet1").Cells(j, 4))^2 
      d = Sqr(d1 + d2 + d3) 
      Worksheets("Sheet1").Cells(i, 16).Value = d 
     Next j 
    Next i 

End Sub 
+0

danke CMArg, ich werde dieses Skript verwenden, um mir zu bauen, und sagen – tatitechno

+0

Siehe Ausgabe in meiner vorherigen Antwort. Und lassen Sie es mich wissen, wenn es Ihnen hilft. – CMArg

+0

das Skript funktioniert gut, vielen Dank .. wie Sie sehen, habe ich den Algorithmus in letzter Zeit geändert, um über i und j zu drucken .. mein schlechtes. Herr John hat mir dabei geholfen .. danke nochmals – tatitechno

0
Option Explicit 

Sub AtomDistance() 
' 
' AtomDistance Macro1 
' 

' 
Dim i As Integer 
Dim j As Integer 
Dim Distance As Double 

Dim Column As String 
Column = InputBox("Which column you want to print results(put a letter)?") 
Dim MyCell11 As String 
Dim MyCell12 As String 
Dim MyCell13 As String 

Dim MyCell21 As String 
Dim MyCell22 As String 
Dim MyCell23 As String 

Dim MyCell3 As String 
j = 9 
For i = 4 To 12 

MyCell3 = Column & i 

MyCell11 = "B" & i 
MyCell12 = "C" & i 
MyCell13 = "D" & i 

MyCell21 = "B" & j 
MyCell22 = "C" & j 
MyCell23 = "D" & j 

Distance = (((Range(MyCell11).Value - Range(MyCell21).Value)^2) + ((Range(MyCell12).Value - Range(MyCell22).Value)^2) + ((Range(MyCell13).Value - Range(MyCell23).Value)^2))^0.5 


If i Mod 4 = 0 Or j Mod 4 = 0 Then 

    Range(MyCell3).Value = Distance 
End If 

j = j + 1 

Next i