tcpuuu 发表于 2012-7-18 17:05:30

讀EXCEL單元格並建立數組(求其他的語法)

$oExcel=objget(@ScriptDir&'\TEST.XLS"); 現有的 EXL檔
$aArray = _ExcelReadArray($oExcel,2,6,17);從第2行開始,抓第6列到第17列共12組
;;;;$aArray=第2行第6列的數據
================================
_ExcelReadArray($oExcel,2,6,17) 這一行 有沒有其他的寫法 像底下這種
可以不加#include <EXCEL.au3>
=============================================
with $o_Workbook
    .activesheet.columns("B").select
endwith

kevinch 发表于 2012-7-18 20:40:07

#include <array.au3>

$xls=ObjGet(@ScriptDir&"\test.xls")
With $xls.activesheet
        $arr=$xls.parent.application.intersect(.range(.cells(2,6),.cells(.rows.count,17)),.usedrange).value
        ;$arr=$xls.parent.application.transpose($arr);取出来后行列是反的,如果需要的话,用这句正过来
EndWith
$xls.close(False)
_ArrayDisplay($arr)这个试下

tcpuuu 发表于 2012-7-18 21:53:55

測試錯誤
;$arr=$xls.parent.application.transpose($arr);取出来后行列是反的,如果需要的话,用这句正过来
這樣沒有數組
$arr= 第2行第6列的數據
$arr= 第2行第7列的數據
都不對

kevinch 发表于 2012-7-19 09:59:45

excel中直接读取两个(含)以上的单元格内容得到的是二维数组,你用一维来引用肯定是不对的,_arraydisplay不是已经显示出来内容了吗?楼主还不知道如何引用??

kevinch 发表于 2012-7-19 10:02:36

#include <array.au3>

$xls=ObjGet(@ScriptDir&"\test.xls")
With $xls.activesheet
      $arr=.cells(2,6).resize(1,12).value
      ;$arr=$xls.parent.application.transpose($arr);取出来后行列是反的,如果需要的话,用这句正过来
EndWith
$xls.close(False)
_ArrayDisplay($arr)如果你只要一行,用这个

tcpuuu 发表于 2012-7-19 12:52:53

本帖最后由 tcpuuu 于 2012-7-19 14:36 编辑


=============================
怎麼引用 ?$arr應該要等於 7146
               $arr = 22

#include <array.au3>
$xls=ObjGet(@ScriptDir&"\test.xls")
With $xls.activesheet
      $arr=.cells(2,6).resize(1,12).value
      ;$arr=$xls.parent.application.transpose($arr);取出?后行列是反的,如果需要的?,用?句正??
EndWith
$xls.close(False)
_ArrayDisplay($arr)

for $i= 0 To 11
msgbox(0,"",$arr[$i]);;;;;;;;;;如何引用 我不會引用
GUICtrlSetData($CEL[$i],$arr[$i]) ;把數據寫入控件
next
==========================
我會了 要這樣引用
$arr=7146
$arr=22
$arr
msgbox(0,"",$arr);;;;;;;;;;如何引用 我不會引用

netegg 发表于 2012-7-22 22:12:05

可以试试用sqlite

tcpuuu 发表于 2012-7-25 10:08:51

指定区域:
$oExcelApp.workbooks(1).activesheet.range("a1:j1").numberformatlocal="@"
第一行:
$oExcelApp.workbooks(1).activesheet.rows(1).numberformatlocal="@"
=======================================================
請問 kevinch 先轉文本格式 再抓取 要如何敘述? 底下這樣是錯誤

$oExcelApp.workbooks(1).activesheet.range("a1:j1").numberformatlocal="@"
$xls=objget(@ScriptDir&"\book.xls")
With $xls.activesheet
      $arr=.cells(1,1).resize(1,10).value
      ;$arr=$xls.parent.application.transpose($arr);加這句直的變橫
EndWith
_ArrayDisplay($arr)

kevinch 发表于 2012-7-25 12:00:09

设定格式是为写入数据做的准备,如果你想取得的是单元格的文本,可以试下
$arr=.cells(1,1).resize(1,10).formula

如果想取得显示文本,只能循环各个单元格,依次取.text

tcpuuu 发表于 2012-7-25 14:08:37

本帖最后由 tcpuuu 于 2012-7-25 15:37 编辑

$xls=ObjGet(@ScriptDir&"\test.xls")
這一行有其他寫法嗎?

=======================
$xls=objget(@ScriptDir&"\book.xls")
With $xls.activesheet
      $arr=.cells(1,1).resize(1,10).value
EndWith
=========================
我每1秒要更新1次(excel單元格的數據 是連接網路的遠端存取 時常的變動)

過程中只要做了其他電腦操作動作(例如開流覽器 開起其他程式 開其他.txt .xxx檔)
便出現 .value (表態式 錯誤) 或 With $xls.activesheet   沒有這個book.xls文件 錯誤

kevinch 发表于 2012-7-25 14:48:09

读取频率太高,如果刚好赶上正在修改单元格内容时就会出错,最好把处理过程写入excel那个工作表的worksheet_change事件里来处理,这样保证独立程序总控全局,就不容易出错了,外部程序这样控制确实不太好安全实现

tcpuuu 发表于 2012-7-25 15:30:25

本帖最后由 tcpuuu 于 2012-7-25 15:32 编辑

刚好赶上正在修改单元格内容时就会出错===這個我有同感

拜託 kevinch 幫忙 寫1個實例來 看看好嗎?

我實在不了解你說的 敘述?
把处理过程写入excel那个工作表的worksheet_change事件里来处理

tcpuuu 发表于 2012-7-25 17:03:54

本帖最后由 tcpuuu 于 2012-7-25 17:13 编辑

抱歉!這裡不應該討論 EXCELVBA

底下這個是 EXCELVBA程式碼    在A1輸入資料, B1立即自動顯示出當日日期
=============================================
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 1 Then
      If Target.Value = "" Then
            Worksheets("Sheet1").Cells(Target.Row, 2).Value = Target
      Else
            Worksheets("Sheet1").Cells(Target.Row, 2).Value = Now
      End If   
      End If

End Sub
================================================
可幫我 改成   如果A1 到J1 的數值有變動便將變動後的數值寫入A2 到J2

我再用AU3抓第二行的數值   這樣應該就不會( 刚好赶上正在修改单元格内容时就会出错)

kevinch 发表于 2012-7-25 19:32:19

Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range, R As Range
Set Rng = Intersect(Target, Range("a1:j1"))
If Not Rng Is Nothing Then
    For Each R In Rng
      If R.Value = "" Then
            R.Offset(1).Value = ""
      Else
            R.Offset(1).Value = "事件写入值"
      End If
    Next R
End If
End Sub宏改成这样试下

tcpuuu 发表于 2012-7-25 20:15:35

本帖最后由 tcpuuu 于 2012-7-26 21:41 编辑

Private Sub Worksheet_Change(ByVal Target As Range)
    If Application.Intersect(Target, ) Is Nothing Then Exit Sub
    Dim myPath As String
    myPath = ThisWorkbook.Path
    Open myPath & "\ABC.INI" For Output As #1
    Print #1, ""
    Print #1, "1=" & Trim()
    Print #1, "2=" & Trim()
    Print #1, "3=" & Trim()
    Print #1, "4=" & Trim()
    Print #1, "5=" & Trim()
    Print #1, "6=" & Trim()
    Print #1, "7=" & Trim()
    Print #1, "8=" & Trim()
    Print #1, "9=" & Trim()
    Print #1, "20=" & Trim()
    Print #1, "11=" & Trim()
    Print #1, "12=" & Trim()
    Print #1, "13=" & Trim()
    Print #1, "14=" & Trim()
    Print #1, "15=" & Trim()
    Print #1, "16=" & Trim()
    Print #1, "17=" & Trim()
    Print #1, "18=" & Trim()
    Close #1
End Sub
=============================
請問 kevinch (excel VBA)1=到 18= 這段寫成 用 循環的(怎麼寫?)
for $i = 1 to 18
next
========================
我會了,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, AU3 比較簡單易懂
For i = 1 To 18
   Print #1, i & "=" & Trim(Cells(2, i))
Next
页: [1] 2
查看完整版本: 讀EXCEL單元格並建立數組(求其他的語法)