新聞中心
用vb.net讀取指定單元格的值到變量
很簡(jiǎn)單,看代碼:
目前成都創(chuàng)新互聯(lián)公司已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、興安盟烏蘭浩特網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
Dim?objexcelfile?As?Excel.Application?=?New?Excel.Application
objexcelfile.DisplayAlerts?=?False
Dim?objworkbook?As?Excel.Workbook?=?objexcelfile.Workbooks.Open("D:\1.xlsx")??'Excel文件路徑
Dim?objimportsheet?As?Excel.Worksheet?=?objworkbook.Sheets(1)?'讀取第一個(gè)Sheet
Dim?intRow?As?Integer?=?objimportsheet.UsedRange.Rows.Count??'獲取總行數(shù)
Dim?prod?As?String?=?objimportsheet.Cells(j,?i).value?'讀取單元格的值(i是列,j是行)
'釋放Excel文件
objworkbook.Close()
objworkbook?=?Nothing
objexcelfile.Quit()
注意需要添加 Microsoft.Office.Interop 的引用。
vb.net定義變量
1. 在visual Studio 2005命令提示工具中,定位到Excel安裝目錄,運(yùn)行“TlbImp EXCEL.EXE”命令,把Excel.exe編譯為Excel.dll。
2. 引用剛編譯好的Excel.dll,添加引用using Excel;刪除Microsoft.Office.Interop.Excel,
用Excel替換Microsoft.Office.Interop.Excel。
vb.net用指針或變量調(diào)用函數(shù)
指針是c語(yǔ)言的概念,VB、VB.NET沒(méi)有指針,除了指針以外也很少有人能玩到你的編程深度,關(guān)鍵看不懂呢。
???就是子程序的名稱,比如每次點(diǎn)擊c后就自動(dòng)調(diào)動(dòng)相對(duì)應(yīng)的子程序,如子程序是
Private Sub my_do ()
........
End Sub
相應(yīng)的AddHandler c.Click, AddressOf my_do
實(shí)際上是個(gè)委托
在VB.net中如何取變量、結(jié)構(gòu)、數(shù)組、函數(shù)的地址?
當(dāng)然可以的,需要System.Runtime.InteropServices?命名空間中的?Marshal?類
Imports?System.Runtime.InteropServices?'這里一定要有?
Public?Class?Form1
Public?Structure?m_Point
Dim?x?As?Integer
Dim?y?As?Integer
End?Structure
Private?Sub?Button1_Click(ByVal?sender?As?System.Object,?ByVal?e?As?System.EventArgs)?Handles?Button1.Click
Dim?i?As?Integer?=?50
Dim?ai()?As?Integer?=?{1,?2,?3,?4,?5}
Dim?pi?As?IntPtr?=?GCHandle.Alloc(i,?GCHandleType.Pinned).AddrOfPinnedObject()?'取得整形變量的指針?
Dim?pai?As?IntPtr?=?GCHandle.Alloc(ai,?GCHandleType.Pinned).AddrOfPinnedObject()?'取得整形數(shù)組首地址指針
MsgBox(Marshal.ReadInt32(pi,?0))?'讀回整形變量指針指向的值
MsgBox(Marshal.ReadInt32(pai,?0?*?4))?'讀回?cái)?shù)組的第一個(gè)元素
MsgBox(Marshal.ReadInt32(pai,?1?*?4))?'讀回?cái)?shù)組的第二個(gè)元素
MsgBox(Marshal.ReadInt32(pai,?2?*?4))?'讀回?cái)?shù)組的第三個(gè)元素
'-----下面是結(jié)構(gòu)--------------------------
Dim?m_p?As?New?m_Point
m_p.x?=?100
m_p.y?=?50
Dim?pm_p?As?IntPtr?=?GCHandle.Alloc(m_p,?GCHandleType.Pinned).AddrOfPinnedObject()?'取得結(jié)構(gòu)首地址指針?
MsgBox(Marshal.ReadInt32(pm_p,?0?*?4))?'讀回結(jié)構(gòu)的第一個(gè)值
MsgBox(Marshal.ReadInt32(pm_p,?1?*?4))?'讀回結(jié)構(gòu)的第二個(gè)值
End?Sub
End?Class
vb.net 定義變量 ,類型,對(duì)象問(wèn)題?
在.NET中,對(duì)象和結(jié)構(gòu)還是有些不同的,定義方式也是其中之一。
像整型、字符串和一些數(shù)值類型都屬于結(jié)構(gòu)。結(jié)構(gòu)只需要這樣定義就可以了:
Dim str As String
系統(tǒng)自動(dòng)分配內(nèi)存,然后就可以對(duì)它進(jìn)行訪問(wèn)了。
如果像這樣聲明普通類:
Dim cla As Class
此時(shí)直接訪問(wèn)cla類成員會(huì)引發(fā)一個(gè)null異常。因?yàn)槟銉H僅聲明了cla的類型(cla是Class類型的),而內(nèi)存中沒(méi)有一個(gè)真正的對(duì)象(類的實(shí)例)。如果你需要一個(gè)實(shí)例,就需要用New關(guān)鍵字,例如:
Dim cla As New Class("some words")
這時(shí)系統(tǒng)會(huì)建立一個(gè)Class對(duì)象,并將cla指向這個(gè)對(duì)象。這樣就完成了一次實(shí)例化。這時(shí)就可以直接訪問(wèn)cla的成員了。
在實(shí)例化時(shí),系統(tǒng)會(huì)調(diào)用對(duì)象的New函數(shù),即構(gòu)造函數(shù)。后面括號(hào)里的內(nèi)容并不是對(duì)象的屬性,而是要傳遞給這個(gè)構(gòu)造函數(shù)的參數(shù)。至于對(duì)象的構(gòu)造函數(shù)是否需要參數(shù)、需要多少參數(shù)以、參數(shù)的類型及重載情況等,取決于要實(shí)例化的類型。
上面的Class只是例子,代換成實(shí)際的類即可。
用最簡(jiǎn)單的代碼介紹一下指針在VB.net里面的用法?
例1:以下程序我們申請(qǐng)幾個(gè)指向不同類型的指針:
’使用StructLayout(LayoutKind.Sequential)屬性告訴net編譯器:結(jié)構(gòu)的元素在內(nèi)存中按其出現(xiàn)的順序排列
StructLayout(LayoutKind.Sequential) _
Public Structure DEFUDT_Test
Public bytb As Byte
Public i32a As Int32
End Structure
Public Function fnGetIntptr1() As IntPtr
’取得一個(gè)4字節(jié)數(shù)組指針
Dim tabytTest(3) As Byte
’以下語(yǔ)句告訴net垃圾回收進(jìn)程不對(duì)tabytTest進(jìn)行處理,也就是說(shuō)tabytTest占用的內(nèi)存區(qū)域固定不變。
Dim thObject As GCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)
Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() ’取得指向字節(jié)數(shù)組的指針
’取得一個(gè)指向32位內(nèi)存數(shù)據(jù)的指針,
’由于使用gchandle取指針的方法只能對(duì)引用的對(duì)象有效,
’所以對(duì)如int32等值類型必須使用將其封裝成為一個(gè)對(duì)象的方法以變?yōu)橐妙愋?/p>
Dim ti32Test As Object = Convert.ToInt32(0)
’以下語(yǔ)句告訴net垃圾回收進(jìn)程不對(duì)ti32test進(jìn)行處理,也就是說(shuō)ti32Test的內(nèi)存位置固定不變。
Dim thObject1 As GCHandle = GCHandle.Alloc(ti32Test, GCHandleType.Pinned)
Dim tpObject1 As IntPtr = thObject1.AddrOfPinnedObject() ’取得ti32Test的首地址
Dim tudtTest1 As DEFUDT_Test
’由于結(jié)構(gòu)是一種值類型變量,為保證指針申請(qǐng)方便,我們申請(qǐng)
’取得一個(gè)和結(jié)構(gòu)tudtTest1大小一致的字節(jié)數(shù)組指針,只要空間占用長(zhǎng)度和結(jié)構(gòu)一樣就可以了
’由于net在結(jié)構(gòu)封裝中會(huì)插入額外的數(shù)據(jù)位,所以一定要用sizeof方法得到結(jié)構(gòu)在非托管使用時(shí)的實(shí)際大小
Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte
Dim thObject2 As GCHandle = GCHandle.Alloc(tudtTest, GCHandleType.Pinned)
Dim tpObject2 As IntPtr = thObject2.AddrOfPinnedObject() ’取得指向結(jié)構(gòu)的指針
’在這兒你可以寫對(duì)指針處理的任意代碼(在例2中會(huì)給予補(bǔ)充)……
’在使用完畢后一定要釋放指針指向的內(nèi)存塊,讓垃圾回收器可對(duì)這個(gè)內(nèi)存塊回收處理
If thObject.IsAllocated Then
thObject.Free()
End If
If thObject1.IsAllocated Then
thObject1.Free()
End If
If thObject2.IsAllocated Then
thObject2.Free()
End If
End Function
上例中指針流程處理可以歸納為:
1、 定義一個(gè)具有合適內(nèi)存長(zhǎng)度的引用變量(關(guān)于引用變量和值變量的差異可以參觀VB.NET的書籍)
2、使用GCHandle.Alloc方法將變量的內(nèi)存區(qū)域固定下來(lái)。
3、使用GCHandle對(duì)象的AddrOfPinnedObject取得該內(nèi)存區(qū)域的首地址并賦值給指針變量.
4、對(duì)指針進(jìn)行操作
5、使用GCHandle對(duì)象的free方法釋放指針指向的內(nèi)存區(qū)域以便net垃圾回收器可以回收這個(gè)內(nèi)存空間
2、指針?biāo)赶驍?shù)據(jù)的存取
在.net中,對(duì)指針指向數(shù)據(jù)的存儲(chǔ)函數(shù)都封裝在marshal類中,主要的函數(shù)包括:Copy、PtrToStringUni 、PtrToStructure 、OffsetOf、WriteXXX,RreadXXX等,其中WriteXXX的表示向指針?biāo)硎镜牡刂分袑懭隭XX類型的數(shù)據(jù),而ReadXXX中作用就是將指針?biāo)诘刂返臄?shù)據(jù)以XXX類型方式讀出。看例程2,我們使用這些方法演示對(duì)例1那幾個(gè)指向不同類型數(shù)據(jù)的指針作數(shù)據(jù)存/取操作。
例2:演示向例1申請(qǐng)得到的幾個(gè)指針執(zhí)行寫入及讀取數(shù)據(jù)的操作.
Marshal.WriteInt32(tpObject1, 0, Convert.ToInt32(77)) ’向ti32Test變量指向的地址寫入32位整數(shù)77
MsgBox("現(xiàn)在ti32Test的值為:" ti32Test) ’因?yàn)樽兞看鎯?chǔ)地址的數(shù)據(jù)已改為77,所以顯示為77
’以下這句之所以可行,因?yàn)閠i32Test是32位整數(shù),而tpObject指向的tabytTest數(shù)組剛好有4個(gè)元素
’而每一個(gè)byte元素都占用8位,合起來(lái)就是32位,和ti32Test占用的空間一樣。這就印證了前面提’
’到的net中指針沒(méi)有指向類型的說(shuō)明。
Marshal.WriteInt32(tpObject, 0, ti32Test)
’以下代碼再將tabytTest字節(jié)數(shù)組的內(nèi)容理解為一個(gè)int32整數(shù),
’并將值賦值給tudtTest結(jié)構(gòu)中的int32元素
’我們使用Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32以取得i32a元素在結(jié)構(gòu)中的內(nèi)存偏移位置
’所以New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32)就臨時(shí)產(chǎn)生了
’一個(gè)指針并指向i32a所在的內(nèi)存地址(, 這個(gè)方法也說(shuō)明了指針可以以字節(jié)為單位進(jìn)行加減計(jì)算以指向合適的變量。
’Marshal.ReadInt32的作用是從指針中讀取一個(gè)32整數(shù)。
Marshal.WriteInt32(New IntPtr(tpObject2.ToInt32 + Marshal.OffsetOf(GetType(DEFUDT_Test), "i32a").ToInt32), _
0, Marshal.ReadInt32(tpObject))
’這兒可以將字節(jié)數(shù)組的內(nèi)容復(fù)制到真正的結(jié)構(gòu)中
MsgBox(Marshal.OffsetOf(tudtTest1.GetType, "i32a").ToInt32)
tudtTest1 = CType(Marshal.PtrToStructure(tpObject2, GetType(DEFUDT_Test)), DEFUDT_Test)
MsgBox("結(jié)構(gòu)tidtTest1中i32a元素的值為:" tudtTest1.i32a) ’此處將顯示剛賦的值77
分享題目:vb.net指向變量 VB中的變量
文章起源:http://www.ef60e0e.cn/article/hhccgj.html