Excel Mac VBA Loop Through Cells và đặt lại một số giá trị


2

Tôi hiện có 12 bản Workbook - một bản cho mỗi địa điểm của công ty chúng tôi. Có nhiều cột và một hàng cho mỗi ngày trong tháng. Mỗi ngày Trình quản lý vị trí điền vào 2 cột và phần còn lại được tính toán tự động. Có một vài người dùng "phức tạp" ngoài kia từ chối nhập số 0 vào cột thứ hai nếu không có số tiền cho ngày hôm đó và họ để trống, gây ra lỗi trên bảng tính.

Sẽ luôn có một giá trị cho mỗi ngày trong cột A, vì vậy tôi muốn chạy macro khi người dùng nhấp vào lưu sẽ kiểm tra cột A để tìm giá trị. Nếu có một giá trị thì điều đó có nghĩa là ngày này đã trôi qua và NÊN có một giá trị trong cột D (ngay cả khi nó bằng không).

Để tổng hợp, nếu cột A không trống, hãy kiểm tra cột D. Nếu nó trống, hãy điền nó vào số 0. Nếu nó không trống, người dùng đã nhập một giá trị, vì vậy chúng tôi có thể tiếp tục. Khi nó đến một ô trong cột A trống, chỉ cần thoát toàn bộ quá trình.

Tôi đã duyệt Internet trong một vài ngày để tìm hiểu điều này và đây là những gì tôi có cho đến nay:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
 Dim curCell As Range
  'Labor Flow Sheet'.Select

  For Each curCell in Range(A1:D31)
    If curCell.Value = "" Then
     <???????>
    End If
  Next curCell
End Sub

Tôi đã đặt phạm vi cho toàn bộ khu vực, tuy nhiên tôi không chắc làm thế nào để biết rằng vòng lặp sẽ chỉ kiểm tra cột A. Thay vào đó phạm vi có nên (A1: A31) không? Sau đó, làm thế nào để tôi bảo nó bỏ qua trong cùng một hàng với cột D để kiểm tra giá trị đó?

Tôi thực sự đánh giá cao sự giúp đỡ của bất cứ ai trước. Tôi hy vọng sẽ được giúp đỡ trong cộng đồng này để trả lời các câu hỏi khác bất cứ nơi nào tôi có thể!

Cảm ơn lần nữa

Câu trả lời:


1

Tôi đã không có cơ hội để kiểm tra điều này nhưng nó sẽ hoạt động tất cả những gì bạn cần làm là thêm sổ làm việc của riêng bạn & amp; tên tờ.

Sub test()
Dim Ws As Worksheet
Dim X As Long

Application.ScreenUpdating = False
Set Ws = Workbooks("").Sheets("Sheet1") ' add your workbook here

For X = 1 To Ws.Range("A" & Rows.Count).End(xlUp).Row
If Not Ws.Cells(X, 1).Value = vbNullString Then
    If Ws.Cells(X, 4).Value = vbNullString Then      
    Ws.Cells(X, 4).Value = "0"        
    End If        
ElseIf Ws.Cells(X, 1) = vbNullString Then        
    Exit Sub    
End If
Next X

Application.ScreenUpdating = True
End Sub

Tùy thuộc vào kích thước của sổ làm việc của bạn, tôi nghĩ rằng nó đáng để vô hiệu hóa cập nhật màn hình nhưng nó cũng không cần thiết phải sử dụng VbNullString tốt hơn "" vì điều này không chiếm bộ nhớ.

Hy vọng nó giúp,

Tom


Cảm ơn Tom rất nhiều! Đó là hướng tôi cần! Bạn có thể cho tôi biết làm thế nào để nó không bắt đầu cho đến hàng 5 không? Tôi có một số thông tin tiêu đề trong các hàng 1-4 mà tôi muốn bỏ qua. Cảm ơn rất nhiều lần nữa!
Dru Darby

không vấn đề gì, nếu bạn thay đổi X = 1 thành X = 5 trên dòng 10, điều này sẽ bắt đầu vòng lặp ở hàng 5.
Tom D
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.