Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel r目标中的每个单元格单元格选择sequence@HTH谢谢你的建议。请随意否决或讨论。我认为这两种方法都能让Stackoverflow变得更好。这就是我们都想要的。是的,我确信它现在起作用了,另外一个解决方案,我使用了你的使用集合的想法,也很有效。谢谢。我_Excel_Vba - Fatal编程技术网

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