0
\$\begingroup\$

I have written a VB.NET program to store purchase transactions into an Excel file. The code runs without any errors and functions as expected, but it takes a significant amount of time to complete, especially when processing transactions.

Public Sub Purchase()
Dim excelApp As New Microsoft.Office.Interop.Excel.Application()
 Dim workbook As Workbook = Nothing
 Dim worksheet As Worksheet = Nothing
 Dim nextRow As Integer
 ' Determine which sheet to use based on the transaction type
 Dim sheetName As String = "Purchase"
 'Purchase
 Try
 workbook = excelApp.Workbooks.Open(excelPath)
 worksheet = CType(workbook.Sheets(sheetName), Worksheet)
 nextRow = worksheet.Cells(worksheet.Rows.Count, 1).End(XlDirection.xlUp).Row + 1
 For Each item In dgPurchaseDetails.Items
 Dim dataRow = TryCast(item, PurchaseDetail)
 If dataRow IsNot Nothing Then
 worksheet.Cells(nextRow, 1).Value = nextRow - 1 ' S.No
 worksheet.Cells(nextRow, 2).Value = cmbSupplierName.SelectedItem.ToString().Trim()
 worksheet.Cells(nextRow, 3).Value = txtInvoiceNumber.Text.Trim()
 worksheet.Cells(nextRow, 4).Value = dataRow.Product
 worksheet.Cells(nextRow, 5).Value = dataRow.Unit
 worksheet.Cells(nextRow, 6).Value = dataRow.Price
 worksheet.Cells(nextRow, 7).Value = dataRow.Total
 worksheet.Cells(nextRow, 8).Value = dataRow.Discount
 worksheet.Cells(nextRow, 9).Value = dataRow.GST
 worksheet.Cells(nextRow, 10).Value = dataRow.FTotal
 nextRow += 1
 End If
 Next
 Dim bTotal As Decimal
 Dim roundedTotal As Decimal
 Dim fractionalPart As Decimal = bTotal - Math.Floor(bTotal)
 If fractionalPart < 0.5D Then
 roundedTotal = Math.Floor(bTotal)
 Else
 roundedTotal = Math.Ceiling(bTotal)
 End If
 worksheet.Cells(nextRow - 1, 11).Value = roundedTotal
 worksheet.Cells(nextRow - 1, 12).Value = dpPurchaseDate.Text
 worksheet.Cells(nextRow - 1, 13).Value = DateTime.Now.ToShortDateString()
 workbook.Save()
 Catch ex As Exception
 MessageBox.Show("An error occurred: " & ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error)
 End Try
 'Day book
 Try
 If TabControl.SelectedItem IsNot Nothing Then
 ' Get the selected TabItem
 Dim selectedTab As TabItem = CType(TabControl.SelectedItem, TabItem)
 ' Get the Header text of the selected tab
 Dim selectedTabText As String = selectedTab.Header.ToString()
 ' Extract specific part (e.g., before "-")
 Dim Tabb As String = selectedTabText.Split("-"c)(0)
 worksheet = CType(workbook.Sheets("Daybook"), Worksheet)
 Dim row As Integer = worksheet.Cells(worksheet.Rows.Count, 1).End(XlDirection.xlUp).Row + 1
 Dim SNo As Integer = 1 ' Default value if this is the first entry
 If row > 2 Then
 SNo = Convert.ToInt32(worksheet.Cells(row - 1, 1).Value) + 1
 End If
 worksheet.Cells(row, 1).Value = SNo
 worksheet.Cells(row, 2).Value = Tabb
 worksheet.Cells(row, 3).Value = cmbSupplierName.Text
 worksheet.Cells(row, 4).Value = txtInvoiceNumber.Text
 worksheet.Cells(row, 5).Value = txtbtotal.Text
 worksheet.Cells(row, 6).Value = dpPurchaseDate.Text
 worksheet.Cells(row, 7).Value = Date.Today()
 workbook.Save()
 End If
 Catch ex As Exception
 MessageBox.Show("An error occurred: " & ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error)
 End Try
 'update stock
 Try
 worksheet = CType(workbook.Sheets("Stock"), Worksheet)
 Dim lastRow As Integer = worksheet.Cells(worksheet.Rows.Count, 1).End(XlDirection.xlUp).Row
 Dim datagrid As DataGrid = dgPurchaseDetails
 For Each item In datagrid.Items
 Dim dataRow = TryCast(item, PurchaseDetail)
 If dataRow Is Nothing Then Continue For
 Dim stockItem As String = dataRow.Product?.Trim()
 Dim quantityStr As String = dataRow.Unit
 Dim quantity As Decimal
 If String.IsNullOrEmpty(quantityStr) OrElse Not Decimal.TryParse(New String(quantityStr.Where(AddressOf Char.IsDigit).ToArray()), quantity) Then
 MessageBox.Show($"Invalid quantity format: {quantityStr}", "Error", MessageBoxButton.OK, MessageBoxImage.Error)
 Return
 End If
 Dim stockFound As Boolean = False
 For row As Integer = 2 To lastRow
 Dim currentItem As String = Convert.ToString(worksheet.Cells(row, 1).Value)?.Trim()
 If Not String.IsNullOrEmpty(currentItem) AndAlso currentItem.Equals(stockItem, StringComparison.OrdinalIgnoreCase) Then
 Dim existingQty As Decimal
 Decimal.TryParse(Convert.ToString(worksheet.Cells(row, 2).Value), existingQty)
 worksheet.Cells(row, 2).Value = existingQty + quantity
 worksheet.Cells(row, 3).value = dataRow.Total
 worksheet.Cells(row, 4).Value = Math.Round(dataRow.FTotal / quantity, 2) ' Update price per unit
 stockFound = True
 Exit For
 End If
 Next
 If Not stockFound Then
 lastRow += 1
 worksheet.Cells(lastRow, 1).Value = stockItem
 worksheet.Cells(lastRow, 2).Value = quantity
 worksheet.Cells(lastRow, 3).value = dataRow.Total
 worksheet.Cells(lastRow, 4).Value = Math.Round(dataRow.FTotal / quantity, 2)
 End If
 Next
 workbook.Save()
 Catch ex As Exception
 MessageBox.Show($"An error occurred: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error)
 End Try
 Dim balanceValue As Double
 If Not Double.TryParse(txtnbalance.Text, balanceValue) Then
 MessageBox.Show("Please enter a valid numeric balance.", "Validation Error", MessageBoxButton.OK, MessageBoxImage.Warning)
 Exit Sub
 End If
 Try
 ' Validate input
 Dim searchName As String = cmbSupplierName.SelectedItem?.ToString()?.Trim()
 If String.IsNullOrEmpty(searchName) Then
 MessageBox.Show("Please select a name.", "Validation Error", MessageBoxButton.OK, MessageBoxImage.Warning)
 Exit Sub
 End If
 ' Initialize Excel application and open workbook
 excelApp = New Microsoft.Office.Interop.Excel.Application()
 workbook = excelApp.Workbooks.Open(excelPath)
 worksheet = CType(workbook.Sheets("Creditors"), Worksheet)
 ' Find the last used row in column 1 (A)
 Dim totalRows As Long = worksheet.Cells(worksheet.Rows.Count, 1).End(XlDirection.xlUp).Row
 Dim foundValue As Boolean = False
 ' Iterate through rows to find the match
 For row As Integer = 2 To totalRows
 If String.Equals(Convert.ToString(worksheet.Cells(row, 1).Value)?.Trim(), searchName, StringComparison.OrdinalIgnoreCase) Then
 worksheet.Cells(row, 2).Value = balanceValue ' Update balance
 foundValue = True
 Exit For
 End If
 Next
 ' Notify if the name was not found
 If Not foundValue Then
 MessageBox.Show($"{searchName} not found in the {sheetName} sheet.", "Information", MessageBoxButton.OK, MessageBoxImage.Information)
 Else
 ' Save the workbook
 workbook.Save()
 End If
 Catch ex As Exception
 MessageBox.Show("Error updating data: " & ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error)
 Finally
 ' Clean up
 If workbook IsNot Nothing Then workbook.Close(False)
 If excelApp IsNot Nothing Then excelApp.Quit()
 ReleaseObject(worksheet)
 ReleaseObject(workbook)
 ReleaseObject(excelApp)
 End Try
 End Sub
toolic
15.9k6 gold badges29 silver badges217 bronze badges
asked Jan 18 at 6:12
\$\endgroup\$

0

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.