gpt4 book ai didi

vba - Excel VBA : MoviesByGenre Function

转载 作者:行者123 更新时间:2023-12-04 20:55:27 24 4
gpt4 key购买 nike

我正在尝试编写一个 Excel VBA 函数来做两件事。首先,它将确定每种类型的电影数量,并使用我编写的 printMovieData 函数将其打印到即时窗口。其次,它将使用我编写的 FindMax 函数返回电影数量最多的类型。我已经提供了 printMovieData、FindMax 的代码,以及到目前为止我为 MoviesByGenre 提供的代码,但是,我不确定我做错了什么,并且正在寻求帮助以使该功能正常工作。目前,Excel 正在返回 #VALUE!错误。

打印电影数据:

Function printMovieData(title As String, arrayTopic, arrayOther)

printMovieData = ""

For i = 1 To UBound(arrayTopic)
Debug.Print arrayTopic(i) & " : " & arrayOther(i)
Next i

End Function

查找最大值:
Function FindMax(valueArray, nameArray) As String

Dim i As Integer
Dim maxValue As Variant

maxValue = 0

For i = 1 To UBound(valueArray)
If valueArray(i) >= maxValue Then
maxValue = valueArray(i)
FindMax = nameArray(i)
End If
Next i

End Function

电影类型:
Function MoviesByGenre(genreRng As Range) As String

Dim i As Integer
Dim genreArray(1 To 4) As String
Dim countArray

genreArray(1) = Action
genreArray(2) = Comedy
genreArray(3) = Drama
genreArray(4) = Musical

For i = 1 To UBound(genreArray)
For j = 1 To genreRng.Count
If genreRng.Cells(j) = genreArray(i) Then
countArray(i) = countArray(i) + 1
End If
Next j
Next i

MoviesByGenre = printMovieData("Movies by Genre", genreArray, countArray)

MoviesByGenre = FindMax(countArray, genreArray)

End Function

最佳答案

TBH 我不希望您的代码能够正常工作的原因有很多。
有一些假设,例如您如何使用 genreRng.Count .这是假设要计数的数据是一行或一列。

以下假设 genreRng.Cells.Count , Ubound(genreArray)UBound(countArray)都是一样的。你不能确保这一点。

缺少变量声明,没有使用 Option Explicit和其他一些事情。

不过,最重要的是,我认为您想要一个不同的对象来处理您的计数。这是CollectionScripting Dictionaries非常有用。

您可以将键作为流派,并将计数保存在关联的值中。如果键已经存在,即重复流派,只需在现有计数中添加一个。

考虑到这一点,一个起点可能类似于(对不起,没有添加错误处理):

Option Explicit

Public Sub test()

Dim genreCount As Object

Set genreCount = CreateObject("Scripting.Dictionary")
Set genreCount = MoviesByGenre(ActiveSheet.Range("A1:A3"), genreCount)

printMovieData "Movies by genre", genreCount

FindMax genreCount

End Sub
Public Function MoviesByGenre(ByRef genreRng As Range, ByVal genreCount As Object) As Object

Dim j As Long

For j = 1 To genreRng.Count 'assumes 1 column/row

Dim currentGenre As String
currentGenre = genreRng.Cells(j, 1)

If Not genreCount.Exists(currentGenre) Then
genreCount.Add currentGenre, 1
Else
genreCount(currentGenre) = genreCount(currentGenre) + 1
End If

Next j

Set MoviesByGenre = genreCount

End Function
Public Function printMovieData(ByVal title As String, ByVal genreCount As Object)

Dim key As Variant

Debug.Print title & vbCrLf 'put to next line

For Each key In genreCount.keys

Debug.Print key & " : " & genreCount(key)

Next key

End Function

Public Function FindMax(ByVal genreCount As Object) As String

Dim maxValue As Long
Dim maxGenre As String
Dim key As Variant

For Each key In genreCount.keys

If genreCount(key) > maxValue Then
maxValue = genreCount(key)
maxGenre = key
End If

Next key

Debug.Print vbNewLine & "Max genre is " & maxGenre & " with " & maxValue

End Function

输入输出:

输入:

Input

输出:

Output

关于vba - Excel VBA : MoviesByGenre Function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48845272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com