我现在有20个物种点数据(有三列:经度、纬度和值)存放在EXCEL中,我想每次提取19个(三列数据是一个),留下一个,每次留下的点不一样,循环一遍,如何编程呢?提出来的能够放在EXCEL中用,并且能够区分20个循环的结果。谢谢大家了。 JD WD zhi 
107.35 39.24 1 
103.83 36.99 1 
99.98 39.31 1 
103.15 38.72 1 
105.68 38.85 1 
99.58 39.49 1 
100.62 38.97 1 
101.5 38.91 1 
103.08 39.44 1 
103.69 40.72 1 
104.88 39.31 1 
105.56 39.16 1 
105.26 40.18 1 
104.79 41.29 1 
105.73 41.34 1 
106.33 41.14 1 
106.64 40.46 1 
106.93 39.87 1 
106.95 39.53 1 
107.29 39.98 1 

解决方案 »

  1.   

    啥意思??不大明白难道是想这样:第一次留下第一个,第二次留下第二个第二十次留下第二十个。是这样吗?for i=1 to 20
       for j=1 to 20
          if j<>i then
             提取该行
          end if
       next j
    next i
      

  2.   

    用VBA吧。
    Option ExplicitSub Get19From20(strSheetName As String, lFirstRow As Long, lLastRow As Long)
        Dim shtSheet As Worksheet, shtCurSheet As Worksheet, lSheetIndex As Long, lRow As Long
        On Error Resume Next
        Set shtSheet = Worksheets(strSheetName)
        If Err.Number <> 0 Then
            MsgBox "在当前工作簿中不存在名为“" & strSheetName & "”的工作表!请检查后重试。", _
                    vbExclamation, "工作表不存在"
            Exit Sub
        End If
        lSheetIndex = 0
        For lRow = lFirstRow To lLastRow
            lSheetIndex = lSheetIndex + 1
            On Error Resume Next
            Set shtCurSheet = Worksheets(CStr(lSheetIndex))
            If Err.Number <> 0 Then
                On Error GoTo ErrorHandle
                Set shtCurSheet = Worksheets.Add(After:=Worksheets(lSheetIndex))
                shtCurSheet.Name = CStr(lSheetIndex)
            End If
            On Error GoTo ErrorHandle
            shtCurSheet.UsedRange.ClearContents
            shtSheet.UsedRange.Copy shtCurSheet.Range("A1")
            shtCurSheet.Rows(lRow).Delete Shift:=xlUp
        Next lRow
        MsgBox "物种点数据提取完毕,共从表“" & strSheetName & _
                "”的第" & lFirstRow & "行到第" & lLastRow & "行中提取" & lSheetIndex & "次数据。" & _
                vbCrLf & "留下第 n 个物种点数据行的提取结果存放在以 n 为名字的工作表中。", , "提取完毕"
        Set shtCurSheet = Nothing
        Set shtSheet = Nothing
        Exit SubErrorHandle:
        MsgBox "正在留下第" & lSheetIndex & "个物种点数据行以提取数据的时候出现错误,程序停止运行。" & _
                vbCrLf & "当前用以保存结果数据的工作表是“" & lSheetIndex & "”。以下为出错信息:" & _
                vbCrLf & vbCrLf & "Error # " & Err.Number & ", " & Err.Description & _
                vbCrLf & "Source: " & Err.Source, vbCritical, "程序异常中止"
        Set shtCurSheet = Nothing
        Set shtSheet = Nothing
    End SubSub DoIt()
        Const SourceSheet As String = "源"
        Get19From20 SourceSheet, 2, 21
    End Sub将你的物种点数据放在工作表“源”中;进入Visual Basic编辑器,插入一个模块,将以上代码贴入该模块;运行DoIt过程,搞定。
      

  3.   

    你这是Leave-One-Out
    是不是想实现LOO算法啊
      

  4.   

    再次看了你提问,我确认你想做Leave-One-Out Cross Validation。告诉你思路吧,其实非常简单:
    留下第一和最后一个时,单独处理;中间的分两次处理,假如要留下第K个,总共有N个样本,对1到K-1,K+1到N分开处理就行了。