Обновление нескольких листов из формы пользователя - PullRequest
2 голосов
/ 14 апреля 2019

Я создал две командные кнопки для инструкции на каждом листе, но вторая не работает, я думаю, что это может быть проблема с диапазоном, но пробовал несколько вещей, и она не работает.

Это простой лист продаж (Sheet1) и лист запасов (StockData). Я поместил часть данных о продажах в складской лист, и все это работает, но когда я обновляю информацию, вторая командная кнопка для обновления информации в складском листе не работает. Я занимаюсь этим уже несколько дней и постарался, насколько я понимаю, из предложений в Интернете.

Private Sub cmdAdd_Click()

If txtLine.Text = "" Or cmbWHS.Text = "" Or cmbStatus.Text = "" Then
If MsgBox("Check Line or Warehouse or Status", vbCritical, "ERROR") = vbOK Then
Exit Sub
End If
End If

'to check the last filled row
lastrow = ThisWorkbook.Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
ThisWorkbook.Worksheets("Sheet1").Cells(lastrow + 1, 1).Value = txtInvoiceNumber.Text
ThisWorkbook.Worksheets("Sheet1").Cells(lastrow + 1, 2).Value = txtLineNumber.Text
ThisWorkbook.Worksheets("Sheet1").Cells(lastrow + 1, 3).Value = txtInvoiceDate.Text


Private Sub cmdSaleStockIn_Click()

'to check the last filled row
lastrow = ThisWorkbook.Worksheets("StockData").Cells(Rows.Count, 1).End(xlUp).Row
ThisWorkbook.Worksheets("StockData").Cells(lastrow + 1, 1).Value = txtStockSaleNo.Text
ThisWorkbook.Worksheets("StockData").Cells(lastrow + 1, 2).Value = txtLineNumber.Text
ThisWorkbook.Worksheets("StockData").Cells(lastrow + 1, 3).Value = txtTransactionCdS.Text

'Они работают, но обновление не хочет быть таким простым ... Я сделал поиск, и он снова помещает все данные в пользовательскую форму

Private Sub cmdFind_Click()
Dim totalrow As Long
totalrow = Sheet1.Range("A1").CurrentRegion.Rows.Count
For currentrow = 2 To totalrow
If Trim(txtLineNumber) = Trim(Cells(currentrow, 2)) Then
txtInvoiceNumber.Text = Cells(currentrow, 1)
txtInvoiceDate.Text = Cells(currentrow, 3)

'Этот код работает

Private Sub cmdUpdate_Click()
Dim totalrow As Long
totalrow = Sheet1.Range("A1").CurrentRegion.Rows.Count
For currentrow = 2 To totalrow
If Trim(txtLineNumber) = Trim(Cells(currentrow, 2)) Then
Cells(currentrow, 1) = txtInvoiceNumber.Text
Cells(currentrow, 3) = txtInvoiceDate.Text
Cells(currentrow, 4) = cmbCustomerName.Text

... и т.д. 'так почему не этот?

Private Sub cmdUpdStock_Click()
Dim totalrow As Long
totalrow = StockData.Range("A1").CurrentRegion.Rows.Count
For currentrow = 2 To totalrow
If Trim(txtLineNumber) = Trim(Cells(currentrow, 2)) Then
Cells(currentrow, 5) = txtInvoiceDate.Text
Cells(currentrow, 7) = cmbWHS.Text

1 Ответ

0 голосов
/ 14 апреля 2019

1-е наблюдение в коде (не работает) - totalrow = StockData.Range("A1").CurrentRegion.Rows.Count будет работать только тогда, когда CodeName листа - StockData. Это можно проверить в окне свойств VBA, имя конкретного листа отображается как StockData. вместо этого можно использовать ThisWorkbook.Worksheets("StockData").Range("A1").CurrentRegion.Rows.Count.

Также всегда было бы лучше обозначить ячейки как ThisWorkbook.Worksheets("StockData").Cells(currentrow, 5) = txtInvoiceDate.Text вместо Cells(currentrow, 5) = txtInvoiceDate.Text. Последнее может вести себя неправильно, если лист не активный лист.

далее Определение рабочего листа и использование With - это лучшая практика. поэтому я попробовал часть кода как

Private Sub cmdUpdStock_Click()
Dim totalrow As Long
Dim wStock  As Worksheet
Set wStock = ThisWorkbook.Worksheets("Stockdata")
With wStock
totalrow = wStock.Range("A1").CurrentRegion.Rows.Count
    For currentrow = 2 To totalrow
        If Trim(txtLineNumber) = Trim(.Cells(currentrow, 2)) Then
        .Cells(currentrow, 5) = txtInvoiceDate.Text
        .Cells(currentrow, 7) = cmbWHS.Text
    End If
Next
End With
End Sub

и работает нормально (насколько я понимаю, как это должно работать).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...