2013-04-03 35 views
6

Tôi đã hy vọng viết một Macro thực hiện nhiệm vụ lặp đi lặp lại cho tôi nhưng việc nhập VBA khó hơn dự kiến. Tôi sẽ học cách lập trình các macro cho excel khi tôi có thời gian vì nó có vẻ cực kỳ hữu ích, nhưng tôi không thể dành 5 đến 12 giờ trong tuần này.Viết công thức vào ô tùy thuộc vào giá trị ô khác

Có thể ai đó ở đây có thể trợ giúp!

Tôi có một vài file excel mà làm theo mô hình này:

Column C - Column D 
-------------------- 
text  | (empty) 
number | (empty) 
number | (empty) 
text  | (empty) 
number | (empty) 
text  | (empty) 
text  | (empty) 
number | (empty) 
text  | (empty) 
number | (empty) 

đâu văn bản và số lượng thay thế ngẫu nhiên cho một vài ngàn tế bào. Tôi cần cột D để giữ, khi cột C là một con số, sự khác biệt với số trước, nếu không nó phải ở lại trống:

Column C - Column D 
-------------------- 
text  | (empty) 
3  | (empty) 
14  | (=C3-C2) : 11 
text  | (empty) 
16  | (=C5-C3) : 2 
text  | (empty) 
text  | (empty) 
21  | (=C8-C5) : 5 
22  | (=C9-C8) : 1 

Vì vậy, các thuật toán là:

var previousNumberCell 
var i = 1 

for all (selected) cells/rows 
if (Row(i).column(C) holds number) { 
    Row(i).column(D).value = "=C"+i+"-"C"+previousNumberCell 
    previousNumberCell = i; 
} 
i++ 

End 

Tôi không quan tâm nếu cho ô đầu tiên hoặc ô cuối cùng thì nó không hoạt động.

Cảm ơn bạn rất nhiều vì đã giúp đỡ hoặc nếu bạn có thể chỉ cho tôi nơi tôi có thể tìm thấy câu trả lời cho điều này. EDIT: đây là một phiên bản đơn giản của vấn đề, có 2 điều tôi không biết làm thế nào tốt với excel macro: chọn một tế bào, và cho biết nếu tế bào là một số ... cho hồ sơ, số các ô đã được chuyển đổi từ văn bản sang định dạng số.

Trả lời

13

này cung cấp cho một shot:

Sub MyMacro() 
Dim rng as Range 
Dim cl as Range 
Dim lastNum as Range 
Set rng = Range(Selection.Address) 'Make sure that your active SELECTION is correct before running the macro' 

If Not rng.Columns.Count = 1 Then 
    MsgBox "Please select only 1 column of data at a time.",vbCritical 
    Exit SUb 
Else: 
    For each cl in rng 
     If IsNumeric(cl.Value) Then 
      If lastNum Is Nothing Then 
       cl.Offset(0,1).Formula = "=" & cl.Address 
      Else: 
       cl.Offset(0,1).Formula = "=" & cl.Address & "-" & lastNum.Address 

      End If 
      set lastNum = cl 
     End If 
    Next 
End If 

End Sub 
+0

@Daren thử ngay. –

+0

Tại dòng nào? Nó đang làm việc để hoàn thành vào cuối của tôi. –

+0

Bạn đã thực hiện * tất cả * các thay đổi (thêm một vài ký hiệu và cũng loại bỏ '.Text' khỏi các dòng thiết lập các công thức). –

8

Bạn có yêu cầu VBA?

Chèn một cột mới trước khi cột C
Cột C với các giá trị của bạn trở nên cột D
Bạn có thể cần columnheaders ..
Trong ô C2 đặt: =IF(E2=0;0;SUM(E$2:$E2)) này xác định hàng với số
Trong ô E2 đặt: =IF(ISNUMBER(D2);1;0) này đặt trật tự cho mỗi hàng với một số để sử dụng tiếp theo trong VLOOKUP
trong tế bào F2 đặt: =IF(ISNUMBER(D2);ABS(D2-VLOOKUP(MAX($C$1:C1);$C$1:D1;2;0));"")
cột Autofill C, E và F.
trong cột F bạn sẽ có được kết quả của bạn, ngoại trừ đầu tiên, đó là "#VALUE "

+0

nó sẽ hoạt động thực sự, chỉ một macro là điều thực sự có ý nghĩa. Bất kỳ cách nào bạn vẫn nhận được +1 – Daren

+0

+1 tốt của mình để tránh VBA và sử dụng các hàm Excel nếu có thể! –

+1

+ 1 Đối với Giải pháp Không phải VBA :) –

-1

Xin chào, bạn có thể làm điều này với một công thức nếu và một công thức được đặt tên. if (isnumber, named formula, 0)

tên công thức (= công thức tra cứu)

+1

Đây có phải là câu trả lời không? –