Sử dụng tính toán trên một Sheet khác để tính toán kết quả ?

Liên hệ QC

Chuotdong

Thành viên thường trực
Tham gia
28/11/06
Bài viết
255
Được thích
60
Tôi cần tính một loạt các dữ liệu trên file DATA-Invert.xls bằng cách dùng các công thức người ta đã tính sẵn trên 1 sheet trong 1 file khác có tên Vincenty.xls

Các bạn xem giúp làm thế nào để copy và tính tự động từ đầu đến hết dữ liệu thì thôi
Cái này chắc phải dùng VBA, xin lỗi post vào thread công thức

Nếu khái quát để coi cách tính Vincenty như một hàm (hộp đen) thì thật tốt, nhưng tôi nghĩ không thể vì hình như VBA không viết vào được một ô trong Sheet

Vì ko biết gì về VBA, mình đã phải nhờ 1 người bạn viết cho đoạn code sau, gửi các ban tham khảo biết đâu khi nào cần đến:
Mã:
Public TinhXong As Boolean

Sub TinhToan()
    Dim Vao As Range, Ra As Range, DuLieu As Range
    Set Vao = ThisWorkbook.Names("VAO").RefersToRange
    Set Ra = ThisWorkbook.Names("RA").RefersToRange
    Set DuLieu = Selection
    Dim i%, j%
    i = 2
    If (DuLieu(1, 1) <> "") Then
        Do While (DuLieu(i, 1) <> "")
            Vao(1, 1) = DuLieu(i - 1, 1)
            Vao(1, 2) = DuLieu(i - 1, 2)
            Vao(2, 1) = DuLieu(i, 1)
            TinhXong = False
            Vao(2, 2) = DuLieu(i, 2)
            'wait for calculation
            Do
                DoEvents
            Loop Until TinhXong
            DuLieu(i, 3) = Ra(1, 1)
            DuLieu(i, 4) = Ra(1, 2)
            DuLieu(i, 5) = Ra(1, 3)
            i = i + 1
        Loop
    Else
        MsgBox "Du lieu khong hop le!"
    End If
End Sub
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Nói thật bạn đừng giận, bài bạn gữi đã lâu mà chẳng thấy ai trả lời ??? Không có nghĩa là yêu cầu của bạn quá khó (vì GPE nhân tài bao la)... Đó là vì cách đặt vấn đề của bạn khó hiểu quá!
Tôi xem file này từ lúc bạn mới đưa lên mà chẳng hiểu bạn nói gì, đành cho qua luôn!
Và còn rất nhiều bài trước đó bạn hỏi cũng bị tình trạng trên: Hỏi đi hỏi lại cở vài chục bài mọi người mới hiểu nổi bạn muốn gì!
Chính vì vậy mà tôi góp ý rằng: Mai này có hỏi điều gì bạn vui lòng đặt mình vào vai trò của người đọc để xem thử liệu đối phương có thể hiểu nổi những gì mình diển đạt hay không?
Nếu không phải vì những câu hỏi quá khó hiểu của các bạn thì BNTT đâu có viết bài này:
Đặt một câu hỏi thông minh như thế nào?
Mong rằng bạn đừng giận về những gì tôi vừa nói ở trên!
 
Mình không có gì giận cả - rất cảm ơn bạn đã góp ý, chỉ có điều mình nghĩ với 2 file mình đã gửi kèm mà bạn ko hiểu được thì quả rất khó cho mình (theo thiển ý của mình thôi: thậm trí mình ko thuyết minh thêm vẫn có thể hiểu được). Những câu hỏi của mình chỉ là một vấn đề nhỏ gặp phải trong công việc, sau đó mình có khái quát lên một chút, nên có thể khó hiểu chăng.
Mình cũng ko bao giờ nghĩ rằng một bài toán nào đó là quá khó, vấn đề là cách giải hợp lý nhất cho bài toán đó thôi vì chẳng hạn với mình ko biết gì về VBA thì luôn muốn giải mọi bài toán bằng công thức; khi đã được lời giải bằng công thức thì muốn ko dùng cột phụ nào là hay nhất - mong bạn hiểu cho
 
Lần chỉnh sửa cuối:
Tôi cần tính một loạt các dữ liệu trên file DATA-Invert.xls bằng cách dùng các công thức người ta đã tính sẵn trên 1 sheet trong 1 file khác có tên Vincenty.xls

Các bạn xem giúp làm thế nào để copy và tính tự động từ đầu đến hết dữ liệu thì thôi
Cái này chắc phải dùng VBA, xin lỗi post vào thread công thức

Nếu khái quát để coi cách tính Vincenty như một hàm (hộp đen) thì thật tốt, nhưng tôi nghĩ không thể vì hình như VBA không viết vào được một ô trong Sheet

Giải nén 2 file chung 1 thư mục
mở file DATA-Invert.xls Nhấn nút lấy kết quả xem kết quả thu được có đúng ý bạn không nhé (chỉ cẩn mở 1 file DATA-Invert.xls này thôi, không cần phải mở cả 2)
PHP:
Option Explicit
Dim Er As Long, i As Long, Path As String
Sub boyxin()
'--------------------------------
'Mở file vincenty.xls
Path = Application.ActiveWorkbook.Path
Workbooks.Open Filename:=Path & "\vincenty.xls"
'--------------------------------
'Lấy dữ liệu
Windows("DATA_Invert.xls").Activate
Range("A2:E3").EntireRow.Hidden = True
Er = [A65500].End(xlUp).Row
Range("C4:E" & Er).ClearContents
    Range("C3").FormulaR1C1 = "=[vincenty.xls]Inverse!R[21]C[3]"
    Range("D3").FormulaR1C1 = "=[vincenty.xls]Inverse!R[21]C[3]"
    Range("E3").FormulaR1C1 = "=[vincenty.xls]Inverse!R[21]C[3]"
For i = 4 To Er - 1
    Cells(2, 1) = Cells(i, 1)
    Cells(2, 2) = Cells(i, 2)
    Cells(3, 1) = Cells(i + 1, 1)
    Cells(3, 2) = Cells(i + 1, 2)
    Range("C" & i + 1).Value = Range("C3").Value
    Range("D" & i + 1).Value = Range("D3").Value
    Range("E" & i + 1).Value = Range("E3").Value
Next
Range("C2:E3").ClearContents
'--------------------------------
'Đóng file vincenty.xls
Windows("vincenty.xls").Activate
ActiveWorkbook.Close SaveChanges:=False
End Sub
Cách làm hơi củ chuối, dùng tạm (File đính kèm chuyển xuống bài #10
rar.gif
boyxin 01.rar (21.8 KB).)
 
Lần chỉnh sửa cuối:
@boyxin: cám ơn bạn, nhưng như mình đã nói rồi, mình ko biết gì về VBA cả.
Chỉ biết dùng thôi. Tuy nhiên nhìn vào code, so sánh thì thấy mã của bạn mình viết hộ thậm trí không cần chỉ ra tên file cụ thể trong code, .v.v.. như vậy mình nghĩ nó khái quát hơn

Bạn có thể sửa lại mã của bạn với: vùng input dặt name là "VAO" và vùng kết quả đặt name "RA" để tiện so sánh đựoc ko ?

mình không phản đối nhưng bạn lần sau post bài để ý dùm có virus đề nghị bạn lần sau kiểm tra trước khi đăng bài nha
Tên Virus là gì vậy bạn ? bạn quét bằng chuong trình gì. Mình kiểm tra ko thấy có
 
Chỉnh sửa lần cuối bởi điều hành viên:
@boyxin: cám ơn bạn, nhưng như mình đã nói rồi, mình ko biết gì về VBA cả.
Chỉ biết dùng thôi. Tuy nhiên nhìn vào code, so sánh thì thấy mã của bạn mình viết hộ thậm trí không cần chỉ ra tên file cụ thể trong code, .v.v.. như vậy mình nghĩ nó khái quát hơn

Bạn có thể sửa lại mã của bạn với: vùng input dặt name là &quot;VAO&quot; và vùng kết quả đặt name &quot;RA&quot; để tiện so sánh đựoc ko ?

Bạn dùng đoạn code này xem sao

PHP:
Option Explicit
Dim Er As Long, i As Long
Dim sPath As String, sFil As String, sFormula As String, sTest As String
Sub boyxin()
sPath = Application.ActiveWorkbook.Path
ChDrive sPath
ChDir sPath
sFil = Dir("*.*")
i = 0
Do While sFil <> ""
    i = i + 1
    Cells(i, 5) = sFil
    sFil = Dir
Loop
sTest = ThisWorkbook.Name
If Cells(1, 5) = ThisWorkbook.Name Then
    sFormula = Cells(2, 5)
Else
    sFormula = Cells(1, 5)
End If
Workbooks.Open Filename:=sPath & "\" & sFormula
    Range("D23").FormulaR1C1 = "=[" & sTest & "]TUNNEL!R[-21]C[-3]"
    Range("D24").FormulaR1C1 = "=[" & sTest & "]TUNNEL!R[-21]C[-3]"
    Range("E23").FormulaR1C1 = "=[" & sTest & "]TUNNEL!R[-21]C[-3]"
    Range("E24").FormulaR1C1 = "=[" & sTest & "]TUNNEL!R[-21]C[-3]"
'--------------------------------
Windows(sTest).Activate
Range("A2:E3").EntireRow.Hidden = True
Er = [A65500].End(xlUp).Row
Range("C5:E" & Er).ClearContents
    Range("C3").FormulaR1C1 = "=[" & sFormula & "]Inverse!R[21]C[3]"
    Range("D3").FormulaR1C1 = "=[" & sFormula & "]Inverse!R[21]C[3]"
    Range("E3").FormulaR1C1 = "=[" & sFormula & "]Inverse!R[21]C[3]"
For i = 4 To Er - 1
    Cells(2, 6) = i - 3
    Range("C" & i + 1).Value = Range("C3").Value
    Range("D" & i + 1).Value = Range("D3").Value
    Range("E" & i + 1).Value = Range("E3").Value
Next
'--------------------------------
Windows(sFormula).Activate
Range("D23:E24").Value = Range("D23:E24").Value
ActiveWorkbook.Close SaveChanges:=True
Range("C1:E3").ClearContents
End Sub
  1. Muốn kiểm tra kết quả INPUT - OUTPUT: Nhấn nút Spinner trong file
  2. Lưu ý: Trong thư mục chỉ có 2 file

  • File 1 có nhiệm vụ tính toán
  • File 2 nhập dữ liệu và lấy kết quả (Input - Output)
 

File đính kèm

Lần chỉnh sửa cuối:
Bạn mình đã sửa lại code, tổng quát hơn:
Mã:
Public TinhXong As Boolean

Sub TinhToan()
    'On Error GoTo THE_END
    Dim Vao As Range, Ra As Range, DuLieu As Range
    Set Vao = ThisWorkbook.Names("VAO").RefersToRange
    Set Ra = ThisWorkbook.Names("RA").RefersToRange
    Set DuLieu = Selection
    Dim i%, m%, n%, dr, dc
    For i = 0 To DuLieu.Rows.Count - 1
        For m = 1 To Vao.Rows.Count
        For n = 1 To Vao.Columns.Count
            'If DuLieu(i + m, n) = "" Then
            '    GoTo THE_END
            'End If
            TinhXong = False
            Vao(m, n) = DuLieu(i + m, n)
        Next
        Next
        Do  'wait for calculation
            DoEvents
        Loop Until TinhXong
        dr = Ra.Row - Vao.Row
        dc = Ra.Column - Vao.Column
        For m = 1 To Ra.Rows.Count
        For n = 1 To Ra.Columns.Count
            DuLieu(i + m + dr, n + dc) = Ra(m, n)
        Next
        Next
    Next
THE_END:
End Sub
Mã:
Sub XacNhanTinhXong()
    TinhXong = True
End Sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
Web KT

Bài viết mới nhất

Back
Top Bottom