Как отобразить значение из таблицы Excel? - PullRequest
0 голосов
/ 06 марта 2020

Я пишу код, который будет выбирать случайную строку из Excel, а затем отображать значения из каждого столбца в этой строке. Проблема в том, что все значения в msgbox оказываются равными 0, даже если они определены по-разному в Excel. Возможно, мне не хватает какой-то точки в моем коде.

xlApp = New Excel.Application
xlWorkbooks = xlApp.Workbooks.Open("C:\Values.xlsx")
xlsheet = CType(xlWorkbook.Sheets("Sheet1"), Excel.Worksheet)
xlsheet.Activate()
xlApp.Visible = True

Dim firstrow As Long, lastrow As Long, Rndrow As Long
firstrow = 2
lastrow = GetFirstEmptyRow(xlsheet) - 1
Rndrow = Int((lastrow - firstrow + 1) * Rnd() + firstrow)
xlCurRow = Rndrow

minA = xlsheet.Range("B" & xlCurRow).Value
MessageBox.Show(minA)
maxA = xlsheet.Range("C" & xlCurRow).Value
MessageBox.Show(maxA)
minB = xlsheet.Range("D" & xlCurRow).Value
MessageBox.Show(minB)
maxB = xlsheet.Range("E" & xlCurRow).Value
minC = xlsheet.Range("F" & xlCurRow).Value
maxC = xlsheet.Range("G" & xlCurRow).Value
Private Function GetFirstEmptyRow(xlsheet As Worksheet, Optional sColName As String = "A") As Long
    GetFirstEmptyRow = xlsheet.Range(sColName&xlsheet.Rows.Count).End(XlDirection.xlUp).Row + 1
End Function

1 Ответ

3 голосов
/ 06 марта 2020

Не используйте Rnd(). Ну, если вам нужно, то вы также должны вызвать Randomize() first

Randomize()
Rndrow = Int((lastrow - firstrow + 1) * Rnd() + firstrow)

, иначе вы получите одно и то же значение при каждом запуске. Вы получили 0. Я получил 12. Он будет отличаться на разных машинах.

Вместо этого используйте Случайный класс

Dim r As New Random()
Rndrow = Int((lastrow - firstrow + 1) * r.NextDouble() + firstrow)

Кроме того, ваш код не ' скомпилировать с Option Strict On. Вы должны поместить это наверху своего файла сначала. (Старайтесь не заставлять ваш код выполнять неявные преобразования всякий раз, когда вы можете предоставить правильные типы. Это добавляет ненужную обработку.) Затем внесите эти изменения

' return an Integer instead of Long
' Range.Row is Integer so this can never be Long unless you have 2 billion rows
Private Function GetFirstEmptyRow(xlsheet As Worksheet, Optional sColName As String = "A") As Integer
    ' use the VB.NET syntax to return, not VBA style
    ' concatenate non-string values with interpolation which performs ToString() implicitly
    Return xlsheet.Range($"{sColName}{xlsheet.Rows.Count}").End(XlDirection.xlUp).Row + 1
End Function
Dim r As New Random()
Dim firstrow = 2
Dim lastrow = GetFirstEmptyRow(xlsheet) - 1
' must cast to some integral number here, Integer is fine
Dim xlCurRow = CInt((lastrow - firstrow + 1) * r.NextDouble() + firstrow)

' again string concatenation when dealing with non-strings
Dim minA = xlsheet.Range($"B{xlCurRow}").Value
' minA is an object
' MessageBox.Show(text As String) takes a string, not an object
MessageBox.Show(minA.ToString())
' or MessageBox.Show($"{minA}")

Я предполагаю, что вы пришли из VBA или VB6 , Класс Rnd и возвращение из функции путем присвоения имени функции будет работать в VB. NET, но не рекомендуется.

...