Не используйте 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, но не рекомендуется.