从txt文件从某行开始读,将数据赋值给一个数组
还是下标越界啊
Private Sub Command1_Click()
  Dim filet() As Byte, filelen As Long, strt() As String, i As Long
  Dim b(2) As String
  Dim data() As String, a() As Long
  Dim n As Long
  Open "e:\3.txt" For Binary As #1
  filelen = LOF(1)
  ReDim filet(filelen - 1)
  Get #1, , filet
  filet = StrConv(filet, vbUnicode)
  strt = Split(filet, vbCrLf)
  '然后假如说你从第7行开始取值给b
  n = 0
  For x = 6 To UBound(strt)
    b(x - 6) = strt(x)
    'Debug.Print b(x - 6)
    data = Split(b(x - 6), "")
     ReDim a(UBound(data))
    For i = 0 To UBound(data)
     a(n) = Val(data(i))-------错误行
     n = n + 1
     Print a(i)
    Next i
  Next
End Sub我的data肯定是有数据的啊
print data(i)都没有问题

解决方案 »

  1.   

    如果print data(i)都没有问题,哪真是奇怪了!
    我看,应该有问题的是b(x - 6) = strt(x),因为Dim b(2) As String,只要UBound(data)>8,就下标越界!
    你在data = Split(b(x - 6), "")
    后面加上:debug.print UBound(data),看看打印出来的是什么?
      

  2.   

    debug.print UBound(data)
    For i = 0 To UBound(data)
    a(n) = Val(data(i))-------错误行
    n = n + 1
    Print a(i)
    Next i
    Next
    End Sub你加断点自己看看就好了
      

  3.   

    刚才修改位置搞错了 试试这样改
    Private Sub Form_Load()
      n = 0
      For x = 6 To UBound(strt)
        b(x - 6) = strt(x)
        'Debug.Print b(x - 6)
        Data = Split(b(x - 6))
        For i = 0 To UBound(Data)
          If x = 6 Then
            ReDim a(UBound(Data))
          Else
            ReDim Preserve a(UBound(Data) + UBound(a) + 1)
          End If
          a(n) = Val(Data(i)) - ------错误行
          n = n + 1
          Print a(i)
        Next i
      Next
    End Sub
      

  4.   

    Print a(i) 要改成 Print a(n)
      

  5.   

    这样改了之后还是a(n) = Val(Data(i)) 下标越界
    结果全是0
      

  6.   

    Private Sub Form_Load()
    n = 0
    For x = 6 To UBound(strt)
    b(x - 6) = strt(x)
    'Debug.Print b(x - 6)
    redim data(0 to 0)
    Data = Split(b(x - 6))  '我觉得你需要跟踪的是每一次的data数组的变化,ubound多少,或者添加上我刚刚的那句
    If x = 6 Then
    ReDim a(UBound(Data))
    Else
    ReDim Preserve a(UBound(Data) + UBound(a) + 1)
    End If
    ‘把拓展数组放在小循环外面
    For i = 0 To UBound(Data)
    a(n) = Val(Data(i)) - ------错误行
    n = n + 1
    Print a(n)
    Next i
    Next
    End Sub
      

  7.   

    Print a(n)下标越界,结果全是0
    我是把把拓展数组放在小循环外面啊
    你刚刚说的要添加的那句是哪句啊
      

  8.   

    这2句顺序错了
    Print a(n)
    n = n + 1
      

  9.   

    n = 0
      For x = 6 To UBound(strt)
        b(x - 6) = strt(x)
        'Debug.Print b(x - 6)
        Data = Split(b(x - 6))
          If x = 6 Then
            ReDim a(UBound(Data))
          Else
            ReDim Preserve a(UBound(Data) + UBound(a) + 1)
          End If
        For i = 0 To UBound(Data)
          a(n) = Val(Data(i)) - ------错误行
          Print a(n)
          n = n + 1
        Next i
      Next
      

  10.   

    Private Sub Command1_Click()
    Dim filet() As Byte, filelen As Long, strt() As String, i As Long
    Dim b(2) As String
    Dim data() As String, a() As Long
    Dim n As Long
    Open "c:\3.txt" For Binary As #1
    filelen = LOF(1)
    ReDim filet(filelen - 1)
    Get #1, , filet
    filet = StrConv(filet, vbUnicode)
    strt = Split(filet, vbCrLf)
    '????????7??????b
    n = 0
    For x = 6 To UBound(strt)
    b(x - 6) = strt(x)
    'Debug.Print b(x - 6)
    data = Split(b(x - 6))
    If x = 6 Then
    ReDim a(UBound(data))
    Else
    ReDim Preserve a(UBound(data) + UBound(a) + 1)
    End If
    For i = 0 To UBound(data)
    a(n) = Val(data(i)) '- ------???
    Debug.Print a(n)
    n = n + 1
    Next i
    NextEnd Sub这个代码我调试通过了,你拷贝过去试试看
      

  11.   

    clear zero你的程序不行啊,调试通不过
    ReDim filet(filelen - 1)  下标越界
      

  12.   

    我刚刚的代码我这里是通的
    你可能用了一个空白文件试验我的代码你每行后面的0是因为你换行前的行尾有个一空格
    4 -3 0 1 空格
    -2....
    解决方法b(x - 6) = rtrim(strt(x))一个数据分两行的话,那就只能是逻辑方面了。不然程序如何知道-15而不是-1 5呢
      

  13.   

    小小修改下
    n = 0
      For x = 6 To UBound(strt)
        b(x - 6) = strt(x)
        'Debug.Print b(x - 6)
        Data = Split(b(x - 6))
          If x = 6 Then
            ReDim a(UBound(Data))
          Else
            ReDim Preserve a(UBound(Data) + UBound(a) + 1)
          End If
        For i = 0 To UBound(Data)
         if data(i)<>"" then
          a(n) = Val(Data(i))
          Print a(n)
          n = n + 1
         end if
        Next i
      Next
      

  14.   

    Data = Split(b(x - 6))
    改为
    Data = trim(Split(b(x - 6)))
      

  15.   

    是这样的,有个txt文件里面只有1,2,4,8,16,32,64,128,-9999,0这些数据(0只有一个),如果可以判断行尾那个数据就可以吧,如果是1的话就看下一个数据,是6的话肯定就是16,是28的话就是128,其他就是1,
    行尾那个数是3的话那个数肯定就是32,6的话就是64,12的话就是128,跳过后面那个数就是。
    不过我不知道行尾怎么判断。另外那个文件就有点不好处理了。
    不过就算一个数据分两行该数据还是连在一起的啊,中间没有空格。
    往行尾那个数前多加几个空格它就到下行去了,而且数据是连在一起的。
    就是比如说-12.345在一行,78在下一行。把-12.345移下一行数据就没有分开了。
    数据分开的话一般都是因为txt文件的该行已经写满了,没写满的话数据还是没有分开的。
      

  16.   

    Open "e:\3.txt" For Input As #2     
         For i = 0 To UBound(b())
      Input #2, temp
    b(i) = Val(temp)
    Next i
    Close #2
    这样读没有问题,不过我不知道这样读的话怎么从某行开始读
    你之前给我代码是整行读取的
    我这个是数据块读取
      

  17.   

    文本文件如果比较小,可以一次读取:Private Sub Command1_Click()
    Dim s() As String, i As Long, b(1 To 10) As String
    Open "e:\3.txt" For Input As #2
    s = Split(StrConv(InputB(LOF(2), 2), vbUnicode), vbCrLf)
    Close #2
    For i = 1 To 10
    b(i) = Trim(s(i + 5)) ' 从第7行开始读
    Next i
    MsgBox Join(b, vbCrLf)
    End Sub
      

  18.   

    小刀惋心,你的这段代码有点不明白。能说说你的思路吗?
    我的数组太大,超出了一维数组的范围,想改为二维的实现
    For i = 0 To bc
        t = a(i)
        If t > 0 And (c(i) <> -9999) Then
          t = 2 ^ (t - 1)
          bsp(i + a_b(a(i))) = bsp(i + a_b(a(i))) Or t  '累计儿子结点状况 最多8个 即当bsp(i)=255 或者 11111111(二进制)
        End If
      Next i
      
      '开始正式转换
      Do
        Stoploop = True
        For i = 0 To bc
          If Not bcd(i) And (c(i) <> -9999) Then '判断是否计算过
          If bsp(i) = 0 Then '判断结点是否是原始结点,没有儿子节点
          If c(i) < 0 Then c(i) = 0 '处理小于0的
            If a(i) = -9999 Then c(i) = -9999    '两个矩阵中只要有一个为-9999,则结果为-9999,
               '如果希望结果仍然是b矩阵的值,可以不要这行代码
               bcd(i) = True          '表明该源汇值没有计算过
               t = a(i)
                 If t > 0 Then
                   t = 2 ^ (t - 1)
                   c(i + a_b(a(i))) = c(i + a_b(a(i))) + c(i)
                   bsp(i + a_b(a(i))) = bsp(i + a_b(a(i))) Xor t     '异或
                   Stoploop = False
                End If
            End If
          End If
        Next i
        Print
      Loop Until Stoploop