Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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 VBA使用户选择的范围变量永久化_Vba_Excel - Fatal编程技术网

Excel VBA使用户选择的范围变量永久化

Excel VBA使用户选择的范围变量永久化,vba,excel,Vba,Excel,我有一个脚本,将儒略日期转换为公历日期。我应该能够点击一个包含我的儒略日期的区域,然后选择一个我想插入我的公历日期的区域。唯一的问题是,一旦我将第一个选定的范围设置为JD(Julian Date),我似乎无法分配新的选定范围 例如,如果我选择B:B作为我的JD范围,那么JD=2 然后,如果我选择D:D作为GD的范围(公历日期),那么GD应该=4,但它仍然等于2。我不确定在我完成这部分后还会出现什么错误,但我现在被困在这里。有人能提供一些见解吗?感谢您的帮助 Sub Julian_to_Grego

我有一个脚本,将儒略日期转换为公历日期。我应该能够点击一个包含我的儒略日期的区域,然后选择一个我想插入我的公历日期的区域。唯一的问题是,一旦我将第一个选定的范围设置为JD(Julian Date),我似乎无法分配新的选定范围

例如,如果我选择B:B作为我的JD范围,那么JD=2

然后,如果我选择D:D作为GD的范围(公历日期),那么GD应该=4,但它仍然等于2。我不确定在我完成这部分后还会出现什么错误,但我现在被困在这里。有人能提供一些见解吗?感谢您的帮助

Sub Julian_to_Gregorian()
    Dim rng As Range, col As Range, cols As Range, arr
    Dim sht As Worksheet, shet As Worksheet, hdr As Long, yn As Long, LastRow As Long
    Dim dest As Range

    On Error Resume Next
    Set rng = Application.InputBox( _
                Prompt:="Please select the column that contains the Julian Date. " & vbNewLine & _
                        " (e.g. Column A or Column B)", _
                Title:="Select Julian Date Range", Type:=8)
    On Error GoTo 0
    jd = Selection.Column
    'pjd = jd.Column

    hdr = MsgBox("Does your selection contain a header?", vbYesNo + vbQuestion, "Header Option")

    Set dest = Application.InputBox( _
                Prompt:="Please select the column that the Gregorian Date will be placed in. " & vbNewLine & _
                        "(A new column will be inserted in this location, preserving the current data in this location.)", _
                Title:="Select Destination Range", Type:=8)
      gd = Selection.Column
     If dest Is Nothing Then Exit Sub
     'gd = Selection.Column

     Set sht = dest.Parent
     Set shet = rng.Parent


     On Error GoTo 0
     'yn = MsgBox("Do you want to insert a new column here?" & vbNewLine & _
      '           "(Choosing 'No' will replace the current cells in your selected range." & vbNewLine & _
       '          "All data in this range will be permanently deleted.)", vbYesNo + vbQuestion, "Destination Range Options")


    LastRow = shet.Cells(Rows.Count, jd).End(xlUp).Row

    Application.ScreenUpdating = False
    'With Range(Cells(1, 3), Cells(1, 2 + Range("B1"))).EntireColumn
     With Cells(1, gd).EntireColumn
     .Insert Shift:=xlToRight
     End With
    'gd.EntireColumn.Insert xlRight
    gd = gd - 1
    For i = 2 To LastRow
    Cells(i, gd).Value = "=DATE(IF(0+(LEFT(" & Cells(i, jd) & ",2))<30,2000,1900)+LEFT(" & Cells(i, jd) & ",2),1,RIGHT(" & Cells(i, pjd) & ",3))"

    Next i
End Sub
Sub-Julian\u to\u Gregorian()
变光变光范围、列变光范围、列变光范围、arr
将sht变暗为工作表,shet变暗为工作表,hdr变暗为长,yn变暗为长,最后一行变暗为长
变暗目的地范围
出错时继续下一步
设置rng=应用程序输入框(_
提示:=“请选择包含儒略日期的列。”&vbNewLine&_
“(如A栏或B栏)”_
标题:=“选择朱利安日期范围”,类型:=8)
错误转到0
jd=Selection.Column
'pjd=jd.列
hdr=MsgBox(“您的选择是否包含标题?”,vbYesNo+vbQuestion,“标题选项”)
Set dest=应用程序输入框(_
提示:=“请选择将放置公历日期的列。”&vbNewLine&_
“(将在此位置插入一个新列,保留此位置的当前数据。)”_
标题:=“选择目的地范围”,类型:=8)
gd=Selection.Column
如果dest为空,则退出Sub
'gd=Selection.Column
设置sht=dest.Parent
设置shet=rng.Parent
错误转到0
'yn=MsgBox(“是否要在此处插入新列?”&vbNewLine&_
““(选择“否”将替换选定区域中的当前单元格。”&vbNewLine&_
““此范围内的所有数据都将被永久删除。)”,vbYesNo+vbQuestion,“目标范围选项”)
LastRow=shet.Cells(Rows.Count,jd).End(xlUp).Row
Application.ScreenUpdating=False
'带范围(单元格(1,3)、单元格(1,2+范围(“B1”))。整个细胞群
含细胞(1,gd)。全细胞瘤
.插入移位:=xlToRight
以
'gd.entireclumn.Insert xlRight
gd=gd-1
对于i=2到最后一行

Cells(i,gd).Value=“=DATE(如果(0+)(左(“&Cells(i,jd)”和“,”2))我没有测试代码的其余部分,而是为了获得正确的列:

  • 替换
  • jd=Selection.Column
    with
    jd=rng.Column

  • 替换
  • gd=Selection.Column
    with
    gd=dest.Column


    代码不起作用的原因很简单:在提示过程中激活的选择不是“真实的”"工作表中的选择仅对提示有效。提示后,提示之前的选择将再次激活,因此,jd和gd将始终等于执行宏之前所选单元格的列。

    因此,jd和gd似乎被识别为用户选择的范围;但是,似乎有b在gd中插入一列后(因此将gd更改为gd+1),我将gd改为'gd=gd-1'。然后在单元格I,gd中输入上面的公式;但是,它似乎没有任何作用。宏运行后,我留下了一个空白列。你对此有什么想法吗?即使没有,再次感谢你让我克服错误!我不确定这个公式应该做什么,但如果我t不输出任何内容,可能不满足if子句。为什么在插入列后要更改gd?它应该保持不变,因此尝试摆脱
    gd=gd-1
    I的印象是,如果gd为3,在gd处插入一列,那么gd将变为4(因为该数据会滑过)。也许我完全误解了这样的想法,即使是这样,也应该是
    gd=gd+1
    。但由于gd是目标列,所以应该保持不变。您以前是否尝试过将其手动插入单元格的公式?