Excel r目标中的每个单元格单元格选择sequence@HTH谢谢你的建议。请随意否决或讨论。我认为这两种方法都能让Stackoverflow变得更好。这就是我们都想要的。是的,我确信它现在起作用了,另外一个解决方案,我使用了你的使用集合的想法,也很有效。谢谢。我
Excel r目标中的每个单元格单元格选择sequence@HTH谢谢你的建议。请随意否决或讨论。我认为这两种方法都能让Stackoverflow变得更好。这就是我们都想要的。是的,我确信它现在起作用了,另外一个解决方案,我使用了你的使用集合的想法,也很有效。谢谢。我,excel,vba,Excel,Vba,r目标中的每个单元格单元格选择sequence@HTH谢谢你的建议。请随意否决或讨论。我认为这两种方法都能让Stackoverflow变得更好。这就是我们都想要的。是的,我确信它现在起作用了,另外一个解决方案,我使用了你的使用集合的想法,也很有效。谢谢。我喜欢你的“激活工作表->重新开始”逻辑[+1!]。我会在工作表\u Change()中的Application.EnableEvents=False之前添加一个On Error GoTo ex语句,以确保在出现问题时回启用事件。至于在代码中包含
r目标中的每个单元格单元格选择sequence@HTH谢谢你的建议。请随意否决或讨论。我认为这两种方法都能让Stackoverflow变得更好。这就是我们都想要的。是的,我确信它现在起作用了,另外一个解决方案,我使用了你的使用集合的想法,也很有效。谢谢。我喜欢你的“激活工作表->重新开始”逻辑[+1!]。我会在
工作表\u Change()
中的Application.EnableEvents=False
之前添加一个On Error GoTo ex
语句,以确保在出现问题时回启用事件。至于在代码中包含我的解决方案逻辑:这可能有点“偷盗”,但您在这方面还很年轻,对我来说很好,因为您努力学习新的东西。所以,让我从你那里偷走激活的想法吧!我也想帮忙。你不同意吗?我刚才提到的你的青春是关于你的生活的。对代码的评论是非常受欢迎的。评论我不是一件好事!什么是“如此生活”顺便说一下?SO=“StackOverflow”@HTH谢谢你的建议。请随意否决或讨论。我认为这两种方法都能让Stackoverflow变得更好。这就是我们都想要的。是的,我确信它现在起作用了,另外一个解决方案,我使用了你的使用集合的想法,也很有效。谢谢。我喜欢你的“激活工作表->重新开始”逻辑[+1!]。我会在工作表\u Change()
中的Application.EnableEvents=False
之前添加一个On Error GoTo ex
语句,以确保在出现问题时回启用事件。至于在代码中包含我的解决方案逻辑:这可能有点“偷盗”,但您在这方面还很年轻,对我来说很好,因为您努力学习新的东西。所以,让我从你那里偷走激活的想法吧!我也想帮忙。你不同意吗?我刚才提到的你的青春是关于你的生活的。对代码的评论是非常受欢迎的。评论我不是一件好事!顺便说一句,“如此生活”是什么?SO=“StackOverflow”使用该系列非常棒![+1]. 但是为什么您要将该语句与IIF
一起使用呢?你能解释一下吗?(试图学习一些新的东西)我使用[IIF()
]函数来避免使用If-Then-Else
块,主要是为了保持代码紧凑,尽管它可能不利于代码的可读性。无论如何,IIF()
的使用必须始终严格控制,因为它不会短路对不起,我的问题似乎不够清楚。我的意思是,这个语句与按单元格编号引用单元格有什么区别?我认为如果您在代码中添加注释来解释该语句,将非常有帮助。谢谢。你所说的“按号码引用单元格”是什么意思?是的!这当然可以做到。而且它会缩短,使它更具可读性。这是之前一次尝试的“幸存者”,由于场景原因,它无法工作。我将编辑答案。谢谢。使用这个系列很棒![+1]. 但是为什么您要将该语句与IIF
一起使用呢?你能解释一下吗?(试图学习一些新的东西)我使用[IIF()
]函数来避免使用If-Then-Else
块,主要是为了保持代码紧凑,尽管它可能不利于代码的可读性。无论如何,IIF()
的使用必须始终严格控制,因为它不会短路对不起,我的问题似乎不够清楚。我的意思是,这个语句与按单元格编号引用单元格有什么区别?我认为如果您在代码中添加注释来解释该语句,将非常有帮助。谢谢。你所说的“按号码引用单元格”是什么意思?是的!这当然可以做到。而且它会缩短,使它更具可读性。这是之前一次尝试的“幸存者”,由于场景原因,它无法工作。我将编辑答案。谢谢。请分享一点你的代码。请分享一点你的代码
Sub JustaGame()
Dim rng As Range, arr(1 To 78) As Variant
Set rng = Range("C9:O14")
i = 1
For Each r In rng
arr(i) = r.Address(0, 0)
i = i + 1
Next r
Call Shuffle2(arr)
For i = 1 To 78
addy = arr(i)
v = Application.InputBox(Prompt:="Please enter a value for cell " & addy, Type:=2)
Range(addy) = v
Next i
End Sub
Public Sub Shuffle2(InOut() As Variant)
Dim o As Object, oc As Long, i As Long, io
Dim j As Long, k As Long
Hi = UBound(InOut)
Low = LBound(InOut)
ReDim helper(Low To Hi) As Variant
Randomize
Set o = CreateObject("System.Collections.ArrayList")
For Each io In InOut
o.Add io
Next io
j = Low
oc = o.Count - 1
For i = 1 To oc
k = Int((o.Count - 1 - 0 + 1) * Rnd() + 0)
helper(j) = o.Item(k)
j = j + 1
o.RemoveAt k
Next i
helper(j) = o.Item(0)
For j = Low To Hi
InOut(j) = helper(j)
Next j
Set o = Nothing
End Sub
Public Sub Shuffle(InOut() As Variant)
Dim i As Long, j As Long
Dim tempF As Double, Temp As Variant
Hi = UBound(InOut)
Low = LBound(InOut)
ReDim helper(Low To Hi) As Double
Randomize
For i = Low To Hi
helper(i) = Rnd
Next i
j = (Hi - Low + 1) \ 2
Do While j > 0
For i = Low To Hi - j
If helper(i) > helper(i + j) Then
tempF = helper(i)
helper(i) = helper(i + j)
helper(i + j) = tempF
Temp = InOut(i)
InOut(i) = InOut(i + j)
InOut(i + j) = Temp
End If
Next i
For i = Hi - j To Low Step -1
If helper(i) > helper(i + j) Then
tempF = helper(i)
helper(i) = helper(i + j)
helper(i + j) = tempF
Temp = InOut(i)
InOut(i) = InOut(i + j)
InOut(i + j) = Temp
End If
Next i
j = j \ 2
Loop
End Sub
Call Shuffle2(arr)
Call Shuffle(arr)
Sub quiz()
Dim ws As Worksheet, target As Range
Set ws = ThisWorkbook.Worksheets("Sheet1")
Set target = ws.Range(ws.Range("A1").Value)
Total = target.Rows.Count * target.Columns.Count
random = Rnd(Total)
For Each cell In target
If cell.Value = "" Then
cell.Select
If cell.Row * cell.Column = random Then
Exit For
End If
End If
Next cell
End Sub
Private Used_Range As Range, Quiz_Range As Range, ThisCell As Range, PreventSelect As Boolean
Private Sub Worksheet_Activate()
FreshStart
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim n As Long, nMax As Long
OnError GoTo ex
Application.EnableEvents = False
If Quiz_Range Is Nothing Then FreshStart
If Not Used_Range Is Nothing Then
If Used_Range.Address = Quiz_Range.Address Then
If MsgBox("Game Over!" & Chr(10) & "Do you want to start over?", vbYesNo) = vbYes Then
FreshStart
Else
GoTo ex
End If
End If
End If
nMax = Quiz_Range.Cells.Count
n = RandBetween(1, nMax)
If Used_Range Is Nothing Then
Set ThisCell = Quiz_Range.Cells(n)
Set Used_Range = ThisCell
Else
Do Until Intersect(Quiz_Range.Cells(n), Used_Range) Is Nothing
n = n + 1
If n > nMax Then n = 1
Loop
Set ThisCell = Quiz_Range.Cells(n)
Set Used_Range = Union(Used_Range, ThisCell)
End If
Quiz_Range.Cells(n).Select
ex:
Application.EnableEvents = True
PreventSelect = False
End Sub
Function RandBetween(MinInt As Long, MaxInt As Long) As Long
RandBetween = Int((MaxInt - MinInt + 1) * Rnd + MinInt)
End Function
Sub FreshStart()
Set Used_Range = Nothing
Set Quiz_Range = Range("C9:O14")
Quiz_Range.ClearContents
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
If PreventSelect Then
ThisCell.Select
MsgBox "You can't select another cell!"
End If
PreventSelect = True
Application.EnableEvents = True
End Sub
Private coll As Collection, Quiz_Range As Range, ThisCell As Range, PreventSelect As Boolean
Private Sub Worksheet_Activate()
FreshStart
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Dim n As Long, nMax As Long, m As Long
OnError GoTo ex
Application.EnableEvents = False
If Quiz_Range Is Nothing Then FreshStart
If coll.Count = 0 Then
If MsgBox("Game Over!" & Chr(10) & "Do you want to start over?", vbYesNo) = vbYes Then
FreshStart
Else
GoTo ex
End If
End If
n = Int(1 + Rnd * (coll.Count))
Quiz_Range.Cells(coll(n)).Select
coll.Remove n
ex:
Application.EnableEvents = True
PreventSelect = False
End Sub
Sub FreshStart()
Set Quiz_Range = Range("C9:F14")
SetColl Quiz_Range
Quiz_Range.ClearContents
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
If PreventSelect Then
ThisCell.Select
MsgBox "You can't select another cell!"
End If
PreventSelect = True
Application.EnableEvents = True
End Sub
Sub SetColl(rng As Range)
Set coll = New Collection
Dim i As Long
For i = 1 To rng.Count
coll.Add i
Next
End Sub
Option Explicit
Dim quizRng As Range
Dim coll As Collection
Dim i As Long
Private Sub Worksheet_Change(ByVal Target As Range)
If Not quizRng Is Nothing Then If WorksheetFunction.CountBlank(quizRng) > 0 Then SelectCell Else MsgBox "game over"
End Sub
Sub Start()
Set quizRng = Range("C9:O14")
With quizRng
SetColl .Cells
.ClearContents
i = 0
End With
End Sub
Sub SelectCell()
Dim n As Long
With quizRng
If coll.Count = 0 Then Exit Sub
i = i + 1
n = Int(1 + Rnd * (coll.Count))
.Cells(coll(n)).Select
coll.Remove n
End With
End Sub
Sub SetColl(rng As Range)
Set coll = New Collection
Dim i As Long
For i = 1 To rng.Count
coll.Add i
Next
End Sub
Private Sub Worksheet_Activate()
MsgBox "Start of the game!"
Start
End Sub
.Cells(m \ .Columns.Count + IIf(m Mod .Columns.Count = 0, 0, 1), IIf(m Mod .Columns.Count = 0, .Columns.Count, m Mod .Columns.Count))
.Cells(coll(n)).Select