Excel函数可返回多个行/列中的值

时间:2019-08-17 20:31:09

标签: excel vba excel-formula

我正在尝试创建excel VBA子例程或函数,以根据情况返回多个行/列中的值。

例如= DaysOfWeek()

如果在单元格A1中输入此公式,则结果应为     A1-周日     A2-星期一     A3-星期二

以此类推.....

在此问题上的任何链接或任何方向将受到高度赞赏。

我不知道它是否可行,但是我肯定已经看到了返回多行/多列数据的第三方公式。

我真的希望有人可以提供一些有用的指示。

非常感谢。

编辑:我不是要对该函数进行7次调用来获取一周的7天。在A1中,我要输入UDF,并且应该填充A1至A7。

Edit2(21 / Aug / 2019)::我对此进行了进一步的阅读,并意识到UDF将值放置在需要知道哪个工作表和哪个单元格的地方。如果我们使用Application.Caller,这将起作用,它应该告诉UDF必须将结果值放在哪里(即,哪个工作表和哪个单元格)。但是Application.Caller导致

  

“错误2023”。

进一步阅读后,我意识到可以通过按钮,宏或Auto_Open等调用Application.caller,因此也尝试使用此代码:

Select Case TypeName(Application.Caller)
    Case "Range"
        Debug.Print Application.Caller.Parent.Name
    Case "String"
        Debug.Print Application.Caller
    Case "Error"
        Debug.Print "Error"
    Case Else
        Debug.Print "unknown"
End Select

调试窗口显示

  

错误。

我希望有人可以提供帮助。预先感谢。

4 个答案:

答案 0 :(得分:0)

尝试此UDF

 Option Explicit
  Function My_day(n As Byte)
  If n > 7 Then n = n Mod 7
  My_day = WeekdayName(n)
  End Function

在任何单元格中尝试以下公式:  = My_day(COLUMNS($ A $ 1:A1))水平         或
= My_day(Rows($ A $ 1:A1))垂直

答案 1 :(得分:0)

据我所知,不可能使用UDF。我试图使其工作,但似乎Microsoft已将工作表上的更改限制在了以下范围内。

此子项将循环显示您输入的范围,并在输入的范围内循环显示工作日。

Sub Day_Fill()
    Dim rng As Range
    Dim DayNum As Integer

    Set rng = Range(InputBox("Input range")) ' Example A1:A10
    DayNum = InputBox("Startday, 1 = Sunday") ' 1-7
    For Each c In rng
        c.Value = WeekdayName(DayNum, False, vbSunday)
        If DayNum = 7 Then DayNum = 0
        DayNum = DayNum + 1
    Next c
End Sub

最新更新。
这与选择有效。
您在第一个单元格中输入要从哪一天开始,然后选择其余的时间。

enter image description here

然后运行子程序,它将显示以下内容:

enter image description here

Sub Day_Fill()
    Dim rng As Range
    Dim DayNum As Integer

    Set rng = Selection
    DayNum = Range(Split(rng.Address, ":")(0)).Value
    For Each c In rng
        c.Value = WeekdayName(DayNum, False, vbSunday)
        If DayNum = 7 Then DayNum = 0
        DayNum = DayNum + 1
    Next c
End Sub

答案 2 :(得分:0)

免责声明:Excel有时可能会崩溃

使用 Evaluate 调用UDF中的Sub

Option Explicit

Public Function DaysOfWeek(Destination As Range)
    ' Destination is the first cell of a desired range to be populated
    ActiveSheet.Evaluate "0+GetWeekDays(" & Destination.Address(False, False) & ")"
End Function

Public Sub GetWeekDays(Destination As Range)
    Destination.Cells(1).Resize(7, 1).Value = Application.Transpose(Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))
End Sub

答案 3 :(得分:0)

您可以尝试以下操作:
将以下公式放在单元格A1中,然后向下拖动。
=TEXT(TODAY()+ROW()-1,"dddd")

用您的日期更改TODAY(),例如“ 19.08.2019”(用于本地格式设置日期)
=TEXT("19.08.2019"+ROW()-1,"dddd")

使用此子项:
点击范围,例如A1,然后运行子波纹管。

Sub DaysOfWeek()
Range(Selection.Address).Offset(0, 0).Resize(7, 1).Value = 
Application.Transpose(Array("Sunday", _
"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))
End Sub

编辑1:

Sub DaysOfWeek()
If Selection.Worksheet.Name = "Sheet1" Then
    Range(Selection.Address).Offset(0, 0).Resize(7, 1).Value = 
    Application.Transpose(Array("Sunday", _
"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"))
End If
End Sub