(BIT小学期编程题解)13~16经验总结

时间:2024.3.24

13~16题目小总结

13题《平面上的邮局》

整体思路:

由于是要找到邮局到各个村庄的最小距离之和,即求曼哈顿距离。这时可以考虑对x,y坐标分别进行距离求解,即所有x,y坐标排序之后的中间数就是邮局的位置,然后就是累和计算。

具体实现:

(1) 可以使用快排对x,y坐标分别进行排序,找到中位数。也可以使用结构体对x,y坐标分别进行排序找到中位数。找到中位数之后进行累和,就是用中位数减去各个坐标的值然后 求绝对值累和。

(2)因为题目中没有要邮局的位置,只是让求距离之和,所以可以这样计算。先将x,y使用快排按顺序排好。然后用最大值减去最小值,第二大值减去第二小值,依次类推。

例如如果对于一组数

1 2 3 4 5 6 7 按照第一种方法我们找到中位数是4,然后需要计算4-1+4-2+4-3+4-4+5-4+6-4+7-4=12;将上面的式子整理一下就是4-1+7-4+4-2+6-4+4-3+5-3+4-4=7-1+6-2+5-3+4-4=12.即为下面的第二种方法,这样计算的话可以省去中间的判断步骤。

14题《ACM计分问题》

ACM比赛规则:

比赛期间,每队使用1台电脑需要在5个小时内使用C、C++、Pascal或Java中的一种编写程序解决7到11个问题。程序完成之后提交裁判运行,运行的结果会判定为正确或错误两种并及时通知参赛队。而且有趣的是每队在正确完成一题后,组织者将在其位置上升起一只代表该题颜色的气球。最后的获胜者为正确解答题目最多且总用时最少的队伍。每道试题用时将从竞赛开始到试题解答被判定为正确为止,其间每一次提交运行结果被判错误的话将被加罚20分钟时间,未正确解答的试题不记时。

基于题目中的叙述和ACM中的比赛规则,我感觉AC之后WA,AC之后又AC这两种情况是不会出现的,因为比赛中没有challenge这一项,如果题目过了就是过了,没有必要再次提交,对于比赛的队伍来说这样的做法是不可理解的。

整体思路:

对每个队伍的所有信息进行统计,然后利用排序进行输出,注意中间时间的记录和最后的输出。

具体实现:

利用结构体将一个队伍的所有信息存储在里面,在输入的时候就进行判断,对结构体中的时间和AC题数进行更新,然后排完序之后就输出。注意输出的时候一共有8中可能的输出情况:111#122#123#113#111111111。。。#11333333。。。#12222222。。。#12333333。。。一共有这么多种,所以输出的时候需要进行适当的判断。

第15题《魔方》

整体思路:

就是进行大型的模拟,利用子函数对魔方的各个小块进行操作,最后得到的魔方与刚开始的魔方对比,如果一模一样就说明可以实现复原,如果不是一模一样就说明不可以实现复原。

具体实现:

根据个人的喜好,可以设置一个一维或是二维的数组来记录开始时候每个魔方54个小块的状态。然后编写9个子函数,表示每一种具体的操作,(逆时针旋转一次相当于顺时针

旋转3次,所以只需要写9个子函数)。在写子函数的时候一定要小心,千万不要把里面的赋值语句写错了,争取一遍写好。要不然找BUG的时候会比再写一次更难受。 第16题《电话号码》

首先写几个等式和几个小常识1T=1024G,1G=1024M,1M=1024K,1K=1024B,一个字节=8B;int用2个字节存储,范围是-32768~32767,long用4个字节存储,范围是-2147483648~2147483647,unsigned int用2个字节存储,范围是0~65535,unsigned long用4个字节存储,范围是0~4294967295,float用4个字节存储,范围是10^-38~10^38,double用8个字节存储,范围是10^-308~10^308,long double用16个字节存储,范围是10^-4913~10^4913.知道了这些以后如果题目再卡内存的话,我们就可以自己计算自己的程序大约需要使用多大的内存了。

整体思路:

因为电话号码最多会有1000000个,无论是用整形数组还是字符型数组来存储根据上面的信息计算都是会超过512K的,所以需要另找方法来存储,使用尽可能少的空间来表示尽可能多的量。参考了《编程珠玑》的一部分内容,之后知道了位图存储的方式,说白了我们一般存储的时候是以字节为单位来存储的,但是位图是以位来存储的,因为一个字节有8个位所以这样存空间一下子就节省了8倍。但是这个存存的只是某一个电话号码是否存在的一种状态,仅仅存储了一种状态。

中间存储的过程就是用一个unsigned char型的数组或是unsigned int型的数组来存储,如果用char来存储,先将电话号码判断之后转化为一个百万大小的数字,然后由于首位不是3就是6,所以取后面的6位进行存储即可。假设这个数是i,那么就可以用c[i/8]=c[i/8]|1<<i%8来进行标记,可以通过判断c[i/8]&1<,i%8是否大于0来判断这个电话是否存在。如果存在就将这个电话号码和他出现的次数存储在一个结构体中,因为最多有1500个电话号码会重复,所以开一个1500大小的结构体内存是完全够用的。然后就是把所有的电话号码判断一下,最后按照电话号码的大小,由小到大进行排序输出,输出的时候第二位用%04d输出。

注意:

(1)注意“-”不影响电话号码的正确性,无论在什么地方都不影响。

(2)因为卡内存,所以大家开数组的时候肯定都会比较小心的擦这边界开,不会开的很随意,所以这个时候要注意自己的程序是否会出现越界的情况。

(3)时间问题,如果不知道自己的程序那个地方做了多余的计算或是判断,可以进行这样的调试,就是单步执行,然后看程序跑的时候跟自己心中想的效果是不是一样的。如果程序多走了,那么就需要对多走的部分进行修改,一般情况下就是设置标记变量,对于数组和结构体来说使用多少就循环多少。

好了,暂时先总结这么多,如果有问题希望大家指正,谢谢!


第二篇:VB编程经验总结


VB编程经验小结:

1.VB中动态加载ODBC数据源的方法:

Sub RegisterDataSource()

Dim strAttribs As String

’建造关键字字符串。

’C:\myfile\myexample.l.mdb数据库文件名(包含路径) strAttribs =“DBQ=” _

& “C:\myfile\myexample.mdb” _

& Chr$(13) & “OemToAnsi=No” _ & Chr$(13) & “SERVER=SEQUEL” _ & Chr$(13) & “Network=DBNMPNTW” _ & Chr$(13) & “Database=WorkDB”_ & Chr$(13) “Address=\\SEQUEL\PIPE\SQL\QUERY”

’建立新的注册的 DSN。

rdoEngine.rdoRegisterDataSource “mydatasource”, “Microsoft Access Driver (*.mdb)”, True, strAttribs

End Sub

Private Sub Form_Load()

Call rdoRegisterDataSource

End Sub &

2.通过相对路径指定数据库文件

在很多情况下,不管采用上述哪一种方法打开数据库,都必须在程序设计时就指定需要打开的数据库文件。但是,我们通常不能保证该软件完成后一定会被安装在每台机器的同一目录下。因此该数据库文件的绝对路径一般在设计时还难以完全确定,只能采用相对路径的办法来解决这个问题。

在VB中,App对象是一个全局对象,用来提供当前应用程序的相关信息,其Path属性反映的是当前应用程序的可执行文件(.exe)所在的绝对路径,并且只在程序运行时才有效。通过使用App对象的Path属性,可以方便地获得当前程序所在的目录路径。因此,如果把数据库文件存放在与程序路径相关的目录下,便可以在程序设计时就指定数据库文件的相对路径,当程序运行时,通过App对象的Path属性动态地获取其绝对路径。

下面的一段代码,用来在程序开始运行时获取程序的路径,并赋值给变量AppPath,然后在数据控件Data1的Database Name属性中与数据库文件的相对路径"Database\Sample.Mdb"结合,组成数据库文件的绝对路径。这段代码通常出现在Form-Load中:

Sub Form_load()

Dim AppPath As String ' 设置路径变量

AppPath=App.Path ' 获取程序路径

If Right(AppPath,1)<>"\"Then AppPath=AppPath+"\"

' 若路径尾部没有"\",则添加之

Data1.Database Name=AppPath+"Database\Sample.mdb" ' 与相对路径结合,组成绝对路径

end sub

3.将datenvironment做为活动连接供查询使用

with rs

......

.activeconnect=datenvironment1.connect1

.open "select * from table"

end with

4.记录分组和参数查询:

这两项工作都是在Command对象的属性页中设置。将记录按某个字段分组:先设置好Connection1连接和Command1的数据源,然后在Command1的属性页“分组”选项卡上选中“分组命令对象”复选框,然后从左边选择一个字段添加到右边框中,确定即可。这样生成的记录集便具有了层次性,和GROUP BY的效果是一样的,可以用MSHflexgrid或报表Data Report来绑定。

使用带单个参数的SQL查询:在Command1的属性页“通用”卡上选中使用“SQL语句”生成记录集,然后输入在WHERE子句中带?问号的查询:SELECT [name],[money] FROM [invoice] WHERE [name] LIKE ?。这个问号就是一个参数,可以在代码中赋值,生成不同记录集。当然,仅这样参数的设置还没完成,在“参数”选项卡上为这个?问

号?设置属性,如参数名,输入/输出参数,数据类型等。

代码中赋予具体的参数值,很简单,在初始化命令对象的语句(DataEnvironment1.Command1)后面附上参数值就可以了,如: Private Sub Form_Load()

DataEnvironment1.Command2 "符章秀"

Set MSHFlexGrid1.DataSource = DataEnvironment1.rsCommand2 End Sub

5.DBGrid控件列宽的控制:

在设计时可通过DefColWidth属性来设置列宽,但这样无法为不同的列设置不同的宽度。那么到底要怎么分别设置每一列的宽呢?这同样可在窗体的Activate事件中实现。

Form_Activate()

DBGrid1?Columns(0)?Width=1000 ′为第一列设置宽度 DBGrid1?Columns(1)?Width=2500 ′为第二列设置宽度 DBGrid1?Columns(2)?Width=1000 ′为第三列设置宽度 End Sub

6.IsNull函数的应用

判断一值是否为空,要用IsNull函数来实现,而不能用判断语句来实现,例如:

If Data1?Recordset?Fields(1)?Value=NULL Then ′要执行的语句

End If

这样无论Data1?Recordset?Fields(1)?Value的值是否为NULL,要执行的语句都执行不了,因为(Data1?Recordset?Fields(1)?Value=NULL)永远等于False,所有含有“NULL”的判断式的值都是False。正确的处理方法为:

If IsNull(Data1?Recordset?Fields(1)?Value)=True Then ′要执行的语句

End If

7.如何用VB代码给ACESS表中添加字段:

cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\test.mdb;Persist Security Info=False" cn.Open

cn.Execute ("CREATE TABLE Employees ([First Name] TEXT (5))")

dim Cn as adobd.connection

Set Cn = New ADODB.Connection

cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\test.mdb;Persist Security Info=False" cn.Open

cn.Execute ("CREATE TABLE 表名(字段1 char(4),字段2 char(4))")

添加字段:

cn.Execute "alter table 表名 “ & “add 字段

3 char(8) "

8.利用磁盘的序列号进行软件加密

大家都知道,当您在命令行中键入“dir”指令后,系统都会读出一个称作Serial Number的十六进制数字。这个数字理论上有上亿种可能,而且很难同时找到两个序列号一样的硬盘。这就是我这种注册方法的理论依据,通过判断指定磁盘的序列号决定该机器的注册号。

要实现该功能,如何获得指定磁盘的序列号是最关键的。在Windows中,有一个GetVolumeInformation的API函数,我们利用这个函数就可以实现。

下面是实现该功能所需要的代码:

首先在把下面的GetVolumeInformation的API函数放入一个模块中。

Public Declare Function GetVolumeInformation Lib "kernel32" _

Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, _

ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, _

lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, _

lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, _

ByVal nFileSystemNameSize As Long) As Long As Long 窗体代码如下:

Option Explicit

Dim localid, ms

Dim WithEvents rs As Recordset

Dim WithEvents cn As Connection

Sub CmdLocalID()

'根据C盘序列号得到原ID

Dim Driver, VolName, Fsys As String

Dim volNumber, MCM, FSF As Long

Dim path As String, dirve As String

Dim res As Long

path = App.path

dirve = Left(path, 3)

res = GetVolumeInformation(dirve, VolName, 127, volNumber, MCM, FSF, Fsys, 127)

'volNumber是C盘序列号

localid = Int(volNumber / 2 + 123456789)

Text2.Text = localid

End Sub

Private Sub Command1_Click()'此过程在第一次输入注册ID时写入数据库,第二次开始验证注册ID

Dim regid, id

Dim cm As ADODB.Command

Set cm = New ADODB.Command

cm.ActiveConnection = cn

Call CmdLocalID

regid = Val(Text1.Text)

If regid = Int(localid / 4 * 1 + 654321000) Then

id = Val(Text1.Text)

cm.CommandText = "UPDATE 注册ID " & " SET 注册ID= " & id

rs.MoveFirst

cm.Execute

frm学生情况.Show 0

Set cn = Nothing

Set cm = Nothing

Set rs = Nothing

Unload Me

Else

ms = MsgBox("你的注册ID不合法或输入有误,请于

138xxxxxxxx联系注册或重新输入!", vbInformation, "提示") Text1.Text = ""

End If

End Sub

Private Sub Form_Load()

Dim apppath As String ' 设置路径变量

Dim lujing, idd

Call CmdLocalID

apppath = App.path ' 获取程序路径

Set cn = New Connection

cn.CursorLocation = adUseClient

If Right(apppath, 1) <> "\" Then apppath = apppath + "\" ' 若路径尾部没有"\",则添加之

lujing = apppath + "data\学生成绩.mdb" ' 与相对路径结合,组成绝对路径

databasepath = lujing

cn.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & lujing

Set rs = New Recordset

rs.Open "select * from 注册ID", cn, adOpenStatic,

adLockOptimistic

rs.MoveFirst

idd = rs.Fields(0).Value

If idd <> "" Then Text1.Text = idd

End Sub

注:如用户格式化C:盘后需重新获得ID。

9.根据窗口变化自动调整控件的大小:

在程序的使用中,如果用户点击最大化或调整窗体的时候,窗体的控件依然不变化,非常不好看,所以我将这段源码贴上,供参考! 非常方便!

方法一:

Option Explicit

Private ObjOldWidth As Long '保存窗体的原始宽度

Private ObjOldHeight As Long '保存窗体的原始高度

Private ObjOldFont As Single '保存窗体的原始字体比 '在调用ResizeForm前先调用本函数

Public Sub ResizeInit(FormName As Form)

Dim Obj As Control

ObjOldWidth = FormName.ScaleWidth

ObjOldHeight = FormName.ScaleHeight

ObjOldFont = FormName.Font.Size / ObjOldHeight

On Error Resume Next

For Each Obj In FormName

Obj.Tag = Obj.Left & " " & Obj.Top & " " & Obj.Width & " " & Obj.Height & " "

Next Obj

On Error GoTo 0

End Sub

'按比例改变表单内各元件的大小,

'在调用ReSizeForm前先调用ReSizeInit函数

Public Sub ResizeForm(FormName As Form)

Dim Pos(4) As Double

Dim i As Long, TempPos As Long, StartPos As Long Dim Obj As Control

Dim ScaleX As Double, ScaleY As Double

ScaleX = FormName.ScaleWidth / ObjOldWidth

'保存窗体宽度缩放比例

ScaleY = FormName.ScaleHeight / ObjOldHeight

'保存窗体高度缩放比例

On Error Resume Next

For Each Obj In FormName

StartPos = 1

For i = 0 To 4

'读取控件的原始位置与大小

TempPos = InStr(StartPos, Obj.Tag, " ", vbTextCompare) If TempPos > 0 Then

Pos(i) = Mid(Obj.Tag, StartPos, TempPos - StartPos) StartPos = TempPos + 1

Else

Pos(i) = 0

End If

'根据控件的原始位置及窗体改变大

'小的比例对控件重新定位与改变大小

Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, Pos(2) * ScaleX, Pos(3) * ScaleY

Obj.Font.Size = ObjOldFont * FormName.ScaleHeight Next i

Next Obj

On Error GoTo 0

End Sub

Private Sub Form_Resize()

'确保窗体改变时控件随之改变

Call ResizeForm(Me)

End Sub

Private Sub Form_Load()

'在程序装入时必须加入

Call ResizeInit(Me)

End Sub

方法二:

如果需要,可以写入bas,然后调用 Option Explicit

Dim FormOldWidth As Long

'保存窗体的原始宽度

Dim FormOldHeight As Long

'保存窗体的原始高度

'在调用ResizeForm前先调用本函数

Public Sub ResizeInit(FormName As Form) Dim Obj As Control

FormOldWidth = FormName.ScaleWidth FormOldHeight = FormName.ScaleHeight On Error Resume Next

For Each Obj In FormName

Obj.Tag = Obj.Left & " " & Obj.Top & " " _ & Obj.Width & " " & Obj.Height & " " Next Obj

On Error GoTo 0

End Sub

'按比例改变表单内各元件的大小,在调用ReSizeForm前先调用ReSizeInit函数

Public Sub ResizeForm(FormName As Form)

Dim Pos(4) As Double

Dim I As Long, TempPos As Long, StartPos As Long Dim Obj As Control

Dim ScaleX As Double, ScaleY As Double

ScaleX = FormName.ScaleWidth / FormOldWidth

'保存窗体宽度缩放比例

ScaleY = FormName.ScaleHeight / FormOldHeight

'保存窗体高度缩放比例

On Error Resume Next

For Each Obj In FormName

StartPos = 1

For I = 0 To 4

'读取控件的原始位置与大小

TempPos = InStr(StartPos, Obj.Tag, " ", vbTextCompare) If TempPos > 0 Then

Pos(I) = Mid(Obj.Tag, StartPos, TempPos - StartPos) StartPos = TempPos + 1

Else

Pos(I) = 0

End If

'根据控件的原始位置及窗体改变大小的比例对控件重新定位与改变大小

Obj.Move Pos(0) * ScaleX, Pos(1) * ScaleY, _

Pos(2) * ScaleX, Pos(3) * ScaleY

Next I

Next Obj

On Error GoTo 0

End Sub

Private Sub Form_Load()

Call ResizeInit(Me) '在程序装入时必须加入

End Sub

Private Sub Form_Resize()

Call ResizeForm(Me) '确保窗体改变时控件随之改变 End Sub

10.改变显示器的刷新率

首先在模块中加入以入API函数声明: Declare Function

EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean

Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwFlags As Long) As Long

Declare Function ExitWindowsEx Lib "user32" _

(ByVal uFlags As Long, ByVal dwReserved As Long) As Long Public Const EWX_LOGOFF = 0

Public Const EWX_SHUTDOWN = 1

Public Const EWX_REBOOT = 2

Public Const EWX_FORCE = 4

Public Const CCDEVICENAME = 32

Public Const CCFORMNAME = 32

Public Const DM_BITSPERPEL = &H40000

Public Const DM_PELSWIDTH = &H80000

Public Const DM_PELSHEIGHT = &H100000 Public Const CDS_UPDATEREGISTRY = &H1 Public Const CDS_TEST = &H4

Public Const DISP_CHANGE_SUCCESSFUL = 0 Public Const DISP_CHANGE_RESTART = 1 Type DEVMODE

dmDeviceName As String * CCDEVICENAME dmSpecVersion As Integer

dmDriverVersion As Integer

dmSize As Integer

dmDriverExtra As Integer

dmFields As Long

dmOrientation As Integer

dmPaperSize As Integer

dmPaperLength As Integer

dmPaperWidth As Integer dmScale As Integer

dmCopies As Integer

dmDefaultSource As Integer dmPrintQuality As Integer dmColor As Integer

dmDuplex As Integer

dmYResolution As Integer dmTTOption As Integer

dmCollate As Integer

dmFormName As String * CCFORMNAME dmUnusedPadding As Integer dmBitsPerPel As Integer dmPelsWidth As Long

dmPelsHeight As Long

dmDisplayFlags As Long

dmDisplayFrequency As Long

End Type

然后在Private Sub Form_Load()中调用下面的过程: Public Sub fblsz()

Dim DevM As DEVMODE '注释:将取得的讯息存放在 DevM erg& = EnumDisplaySettings(0&, 0&, DevM)

DevM.dmFields = DM_PELSWIDTH Or DM_PELSHEIGHT '注释:Or DM_BITSPERPEL

DevM.dmPelsWidth = 800 '注释:想要设定的屏幕宽度 DevM.dmPelsHeight = 600 '注释:想要设定的屏幕高度

'注释:我们不更改色板,因为一旦更改色板就必须重新开机! '注释:DevM.dmBitsPerPel = 32 (could be 8, 16, 32 or even

4) 注释:此行可用于改变色板

'注释:以下这行指令会暂时更改屏幕的分辨率,是测试性的,不一定成功,

'注释:不过因为没将设定值写到注册表,所以虽然可能更改成功,

'注释:但是一旦重新开机后,会自动恢复成更改前的设定值 erg& = ChangeDisplaySettings(DevM, CDS_TEST)

'注释:上面的指令若成功,而且您想永久性的更改使用者的屏幕分辨率,

'注释:您还必须使用下一行指令,将资料写到注册表 '注释: erg& = ChangeDisplaySettings(DevM,

CDS_UPDATEREGISTRY)

'注释:但是如果您只是想暂时更改使用者的屏幕分辨率,就不需要了.

'注释:当然并不是您随便设定一个值,就一定会成功的更改屏幕分辨率,

'注释:所以还需要检查是否更改成功!下面的程序就是检查是否更改成功

Select Case erg&

Case DISP_CHANGE_RESTART

'注释:通常如果有更改到色板,或者较老的板子,会要求重新开机

an = MsgBox("您必须重新开机!", vbYesNo + vbSystemModal, "讯息")

If an = vbYes Then

erg& = ExitWindowsEx(EWX_REBOOT, 0&)

End If

Case DISP_CHANGE_SUCCESSFUL

'注释:如果更改成功且不需重新开机,您就可以将设定值写到注册表中

erg& = ChangeDisplaySettings(DevM, CDS_UPDATEREGISTRY) Case Else

'注释: 更改不成功

MsgBox "不支持此一模式!", vbOKOnly + vbSystemModal, "错误!"

End Select

End Sub

11.ACESS导入到EXCEL中:

首先在模块中加入以下过程:

Public Sub AcessTOExcel(sqlstr As String, rs As Recordset, cn As Connection) '此过程导出时可导出字段名。

Dim Irowcount As Integer

Dim Icolcount As Integer

Dim xlApp As Excel.Application

Dim xlBook As Excel.Workbook

Dim xlSheet As Excel.Worksheet

Dim xlQuery As Excel.QueryTable

With rs

If .State = adStateOpen Then

.Close

End If

.ActiveConnection = cn

.CursorLocation = adUseClient

.CursorType = adOpenStatic

.LockType = adLockReadOnly

.Source = sqlstr

.Open

End With

With rs

If .RecordCount < 1 Then

MsgBox ("没有记录!")

Exit Sub

End If

Irowcount = .RecordCount '记录总数 Icolcount = .Fields.Count '字段总数 End With

Set xlApp = CreateObject("Excel.Application") Set xlBook = Nothing

Set xlSheet = Nothing

Set xlBook = xlApp.Workbooks().Add

Set xlSheet = xlBook.Worksheets("sheet1") xlApp.Visible = True

Set xlQuery = xlSheet.QueryTables.Add(rs,

xlSheet.Range("a1")) '添加查询语句,导入EXCEL数据

With xlQuery

.FieldNames = True

.RowNumbers = False

.FillAdjacentFormulas = False

.PreserveFormatting = True

.RefreshOnFileOpen = False

.BackgroundQuery = True

.RefreshStyle = xlInsertDeleteCells

.SavePassword = True

.SaveData = True

.AdjustColumnWidth = True

.RefreshPeriod = 0

.PreserveColumnInfo = True End With

xlQuery.FieldNames = True '显示字段名 xlQuery.Refresh

xlApp.Application.Visible = True

Set xlApp = Nothing '"交还控制给Excel Set xlBook = Nothing

Set xlSheet = Nothing

End Sub

然后在Command1_Click()中调用: Private Sub Command1_Click()

Dim sqlstr As String

sqlstr = "select * from " & hzbm

AcessTOExcel sqlstr, rs, cn

rs.Requery

DataGrid1.Refresh

End Sub

不导出字段名的方法:

Private Sub AcessTOExcel_Click() ' Acess导入至Excel Dim myexcel As New Excel.Application '定义EXCEL对象 Dim mybook As New Excel.Workbook '定义EXCEL的工作薄对象

Dim mysheet As New Excel.Worksheet '定义EXCEL的工作表对象

Set mybook = myexcel.Workbooks.Add '添加一个新的BOOK Set mysheet = mybook.Worksheets.Add '添加一个新的SHEET

myexcel.Visible = True

mysheet.ClearArrows

mysheet.Cells.CopyFromRecordset adoPrimaryRS

‘adoPrimaryRS为连接到ACESS数据库的ADO的RECORDSET对象.

Set myexcel = Nothing

Set mybook = Nothing

Set mysheet = Nothing

VB数据导出EXCEL之重要属性

所以积累的一点属性,因为EXCEL的属性在VB的MSDN中很难找到几个,这些都是我在实践中得到的,今天算是做了个总结,以后忘了,也有地方可以找了

Dim Appexcel As Excel.Application '定义一个EXCEL对象

Dim Wbexcel As Excel.Workbook '定义一个EXCEL实例 Dim wsexcel As Excel.Worksheet '定义一个工作表 Set Appexcel = CreateObject("excel.application" Appexcel.WindowState = xlMaximized '最大化显示 Appexcel.Caption = strTitle '标题

Set Wbexcel = Appexcel.Workbooks.Add

Appexcel.Visible = True

Set wsexcel = Appexcel.Sheets(1)

'设置左边距和右边距

wsexcel.PageSetup.LeftMargin = 20

wsexcel.PageSetup.RightMargin = 0.7

wsexcel.Cells(1, 1).Value = "AAAA" '单元格的值 wsexcel.Range("A11".MergeCells = True '是否合并单元格

wsexcel.Range("A11".Font.Size = 24 '字体大小

wsexcel.Range("A11".Font.FontStyle = "宋体" '字体

wsexcel.Range("A11".Font.Bold = True '粗体

wsexcel.Range("B2:E2".Borders(xlBottom).Weight = xlThin '下划线

wsexcel.Range("B2:E2".Borders(xlTop).Weight = xlThin '上划线

'水平居中和垂直居中

wsexcel.Range("A2:A4".HorizontalAlignment = xlCenter wsexcel.Range("A2:A4".VerticalAlignment = xlCenter wsexcel.Range("A1".BorderAround (1) '单元格边框 wsexcel.Cells(2, 1).ColumnWidth = 14 '设置列宽 wsexcel.Columns("D".NumberFormat = 0 '设置列的显示格式,数字以文本格式显示,(整列修改用Columns,单个单元格修改用Range)

wsexcel.Columns("E".Hidden = True '列隐藏

wsexcel.Range("E5".WrapText = True '文本自动换行 END Sub

12. EXCEL导入到ACESS中的方法:

Private Sub ExcelTOAcess_Click() 'Excel导入至Acess On Error GoTo errorh:

lblStatus.Caption = lblStatus.Caption & " 数据导入"

Dim ros As New Recordset '定义与Excel数据库连接的记录集对象

Dim sheetname As String

Set con = New ADODB.Connection

CommonDialog1.Filter = "Excel Files(*.xls)|*.xls" CommonDialog1.ShowOpen

lujing = CommonDialog1.FileName

If lujing <> "" Then

Form1.Show vbModal, Me’此窗体为选择EXCEL工作表的窗体.

If Text1.Text <> "" Then

sheetname = Text1.Text & "$]"

con.ConnectionString =

"Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=false;Data Source=" & lujing & ";Extended

Properties='Excel 8.0;HDR=Yes;IMEX=1'" '连接Exce数据库

con.Open '打开Exce数据库

ros.Open "Select * From [" + sheetname, con, 1, 1 '打开Excel数据库的要导出的表

If ros.EOF = True Then

Exit Sub

End If

While Not ros.EOF

cn.Execute "Insert Into 学生成绩册(考号,姓名,年级,班级,学校,语文,数学,英语) Values ('" & ros(0) & "','" & ros(1) & "','" & ros(2) & "','" & ros(3) & "','" & ros(4) & "','" & ros(5) & "','" & ros(6) & "','" & ros(7) & "')" '向ACESS数据库的要导入的表中导入记录

ros.MoveNext

Wend

ros.Close

con.Close

Set ros = Nothing

Set con = Nothing

Call cmdRefresh

End If

End If

Exit Sub

errorh:

MsgBox Err.Description

On Error GoTo 0

End Sub

13.Visual Basic 安装程序制作

安装程序制作是做项目必不可少的一道工序,网上的安装软件很多,可以用五花八门来开形容了~~~~

在此笔者介绍一个最简单的安装方法,就是用VB自带的打包程序进行打包,虽然比较普通,不过内部却有不少窍门,相信这一点知道的人可能不多吧!!(请大家一定看到最后,好戏在后头)好了,不废话了,开始进入正题。 ①运行打包向导,如下图所示:

VB编程经验总结

VB编程经验总结

②点击“浏览”按钮,选择要打包的工程。然后单击“打包”按钮(在此只介绍打包,其他的功能不做介绍)。进入下一个页面,如下图所示:

VB编程经验总结

③选择要打包的类型,普通的EXE工程选择“标准安装包”就可以了,控件之类的看使用的地点,如果是在网页中使用,请选择“Internet软件包”,然后点击“下一步”按钮。如下图所示:

VB编程经验总结

④选择包文件存放的位置(这一点不用多说了吧),如下图所示:

VB编程经验总结

⑤向导自动找出了工程中应用的控件、DLL等文件,你需要自己到工程中检查一下,看看所包含的文件是否全,第三方控件所带的文件一定要带上,否则麻烦多多~~~,然后点击下一步,如下图所示:

VB编程经验总结

⑥选择打包的文件类型,根据需要,如果你发布是用光盘,则选择单个的压缩文件,如果发布是用软盘之类的,则选择多个压缩文件。(当然,这不是绝对的,用光盘你也可以选择多个压缩文件,不过可能没有人这么干~~~)。然后单击“下一步”。如下图所示:

VB编程经验总结

⑦确定安装程序的标题,就是在安装背景上显示的文字。然后单击“下一步”,如下图所示:

VB编程经验总结

⑧在这里你可以设置在“开始菜单”中显示哪些项目,比如你可以加卸载程序项,可以选择“新建项”按钮,然后在“目标”栏中输入:$(WinPath)\st6unst.exe -n "$(AppPath)\ST6UNST.LOG",包括双引号。在“开始”项目中选择“$(WinPath)”,不包括双引号。然后点击确定,如下图所示:

VB编程经验总结

⑨在此你可以更改文件夹的安装位置,然后点击“下一步”,如下图所示:

VB编程经验总结

⑩在此你可以将文件设置为共享(即文件可以被多个程序使用)。到此为止安装制作完成。

安装完之后会生成三个文件和一个文件夹,如下图所示:

VB编程经验总结

SERTUP.LST 安装信息文件

.CAB文件包是数据文件,安装的文件全部在包里。

Setup.exe是安装的主文件。

Support是压缩包中所包含的所有文件。如下图所示:

VB编程经验总结

这个文件夹里有一个比较重要的文件就是“执照套打.BAT”这个批处理文件(不同的工程,文件名会不一样),当你的工程改动之后,你可以将工程重新编译一下,然后将执行文件拷贝到此SUPPORT目录下,执行这个批处理文件,就可以重新打包,而不需要每次改动都运行打包向导了。

还有一个比较重要的文件就是SETUP1.EXE这个文件,他是安装的主文件,安装时我们看到的界面就是这个文件运行产生的。他是用VB写的,源程序在VB的安装目录下:“C:\Program Files\Microsoft Visual

Studio\VB98\Wizards\PDWizard\Setup1\SETUP1.VBP”,你可以用VB直接来编

辑此工程(VB的安装界面太丑了,所以你可以自己改动,改的怎么样就要看你自己的能力了~~~),如果在安装之后想在桌面上加上程序的快捷方式,可以编译此工程,打开“frmSetup1”窗口,在其代码的第463行的位置上加如下代码:

Dim sProgramsPath As String

Dim sDesktopPath As String

sProgramsPath = GetSpecialFolder(sfidPROGRAMS)

sDesktopPath = GetSpecialFolder(sfidDESKTOP)

sProgramsPath = sProgramsPath & "\" & gstrAppName & "\" & gstrAppName & ".lnk"

sDesktopPath = sDesktopPath & "\" & gstrAppName & ".lnk"

FileCopy sProgramsPath, sDesktopPath

下面对向导生成的SERTUP.LST(安装信息文件)进行一下介绍,如下图所示:

VB编程经验总结

这是文件的第一个区的内容,SetupTitle设置的是解压窗口的标题,

SetupText设置的是解压窗口的内容。改动之后,如下图所示:

VB编程经验总结

接下来介绍一下SERTUP.LST文件Setup区的作用,如下图所示:

VB编程经验总结

改动Color为不同的值,可以改变安装窗口的背景色(默认为蓝色,看都看腻了)。改为16之后为绿色(当然还有其他的颜色,你可以自己慢慢试~~~),效果如下图所示(这是我改动之后的VB自带的安装程序的安装界面,大家觉得怎么样,是不是不比其他的一些安装软件的界面逊色):

VB编程经验总结

好了,安装程序就介绍到这了,当然了,VB的安装程序完全是VB自己做的,到底怎么改以及改动的漂亮与否,就要看你自己的水平与美术功底了,反正安装程序的源码都给你了,你想怎么做都行~~~~~

13.解决安装过程中:注册文件 ′C:\WINDOWS\SYSTEM\expsrv.dll′

时出错;错误:

DLL有两种,一种是标准DLL,另一种是ActiveX DLL。前者拷贝到

用户机器上就可以工作了,而后者还需要调用DLL中的

DllRegisterServer或者使用RegSvr32进行注册才能使用。你可以

打开VB98\Wizards\PDWizard\VB6dep.ini文件。下面是这个文件的片断:

[ExpSrv.dll] &o

Dest=$(WinSysPathSysFile) R

CABFileName=MSJet35.cab C

CABDefaultURL=/controls/vb6 ILzh|Z

CABINFFile=MSJet35.inf r{z8cC 月下之论坛|知青论坛|安达物流系统|五子棋[MSRD2x35.dll] z;

Dest=$(WinSysPathSysFile) T]9H=g

Register=$(DLLSelfRegister) K

CABFileName=MSJet35.cab i

CABDefaultURL=/controls/vb6 |*w

CABINFFile=MSJet35.inf m@

?虚可以看到MSRD2x35.dll比ExpSrv.dll多一行Register=

$(DLLSelfRegister),这是因为MSRD2x35.dll是ActiveX DLL。ExpSrv.dll是普通的DLL,没有DllRegisterServer,也用不着注册。你所遇到的问题是VB 6的一个Bug(在VB 6 SP3中已经修复)。如果你的VB6dep.ini文件的ExpSrv.dll多了Register一行,应该删除。或者打开安装程序的Setup.lst,删除其中ExpSrv.dll一行中的“$(DLLSelfRegister)”字样。 V+X3

?虚问题:我在做成安装文件后,安装过程中系统缺省的目录是C:\Program Files\Tele,而我需要的是C:\Tele2000,请问有办法修改吗? Z##

?虚答:要修改安装程序的缺省目录,可以打开安装盘的Setup.lst文件,在这个文件中可以找到下面一行: '

?虚谷DefaultDir=$(ProgramFiles)\tele G9T@

将这行中的“$(ProgramFiles)\tele”修改为你想要的目录(如C:\Tele2000)就可以了。 8

?虚谷问题:用VB 5的安装向导制作的程序安装包里,总有一个.dep文件,请问这个文件有什么用?是否与OCX注册有关?如何打开?如何编辑? pUp

?虚谷答:只有当你为ActiveX控件制作安装包的时候,才会出现.dep文件。这个文件主要是供使用你的ActiveX控件的程序设计者制作他自己程序的安装盘时使用的。你的用户在使用Setup Wizard制作安装盘时,Setup Wizard会读取这个文件,检查你的ActiveX控件需要哪些DLL支持。一般不用手工修改这个文件,如果你认为确有必要,可以使用记事本打开修改。 {

问题:我用VB+Access开发数据库系统。但到发布时用VB自已的发布向导时,我程序目录中的子目录的文件却加入不正常,向导不按子目录区分,而是将所有文件都加到程序目录中。怎么办? Se ?答: VB的安装向导是支持制作包括子目录的安装程序的。运行安装向导到“文件小节”一步,在对话框中选择“添加”按钮,然后

选择应该放置在子目录中的文件添加到文件列表中。 Y

?虚然后从文件列表中选择该文件,点击 “文件详细资料”按钮。在图3所示对话框中设置目标路径。最好不要用绝对路径(如

C:\MyProject)来指定安装位置,这样会给用户带来不便。安装向导使用宏来指示文件要安装的位置。这些宏只在安装程序中有效。宏的含义参见表1。如果要将文件放置在应用程序目录下的\Data子目录下,可以使用$(AppPath)\Data来指定安装路径。 L

问题:安装时,用VB自己的“展开与打包向导”制作的安装盘,不知道怎么让程序在桌面上放一个快捷方式? \n^v

?虚答:VB“展开与打包向导”所生成的安装程序的工作步骤是这样的:先运行Setup.exe,这个程序将VB的运行库安装到用户的机器上,同时将.cab文件中的文件释放到临时目录中,然后再调用临时目录中Setup1.exe完成余下的安装工作。Setup1.exe是由VB写的(正是这个原因所以要先安装VB的运行库),其源程序可以在

VB98\Wizards\PDWizard\Setup1中找到。如果你对VB的安装程序不满意,希望添加新功能,可以直接修改Setup1.vbp。具体到你的问题,在VB中可以打开Setup1.vbp,然后修改Setup1.frm的form—Load事件,在其中可以找到如下几行: ' ′ ′ Create program icons (or links, i.e. shortcuts). :6a

′ If (fMainGroupWasCreated = True) Or ((cIcons > 0) And TreatAsWin95()) Then |

ShowStaticMessageDialog ResolveResString(resPROGMAN)

PM\i

CreateIcons gsICONGROUP FHX|#

?虚谷社 ′Do the same for other sections in SETUP.LST if you′ve added your own. r

?虚谷社区|棋 ′CreateIcons ″MySection″ m5j

?虚谷社区|棋魂 ′CreateIcons ″MyOtherSection″ ~ ?虚谷社区 End If O

?虚谷社区在If.. End If中加上: Tq0g

?虚谷社区OSfCreateShellLink ″..\..\Desktop″, _ Y3Dx ?虚谷社区|″我的程序″, gstrDIR—DEST+″

MyProg.exe″, ″ ″ Z

?虚谷重新编译Setup1.vbp,用Setup1.exe替换掉原来的Setup1.exe即可。 Jc

? 问题:我用VB 5.0安装向导生成的安装程序,安装到最后时总是显示“文件C:\Windows\System\$(DllSelfRegisterEx)不能被注册,由于它未找到”的提示信息后安装失败,请问原因? $% ? 答:这是VB 5.0/6.0的一个Bug。

如果运行Visual Basic 5.0生成的安装盘,会产生下面的错误: ?虚谷社区|棋魂The file ′<Windows System Folder>\

$(DLLSelfRegisterEx)′ could not be registered because it was not found. hg

?虚如果运行Visual Basic 6.0生成的安装盘,会产生下面的错误:

M

?虚谷社The file ′<TEMP Folder>\Msftqws.pdw\

$(DllSelfRegisterEx)′ could not be registered because it was not found. vtDS

?虚这个问题发生在分发Microsoft Calendar control(MSCal.ocx)时。MSCal.dep文件中的"Register="行被错误地设置成

$(DLLSelfRegisterEx)了。 Gj]d

?虚解决办法如下: tWn^9

?虚1. 使用记事本打开Setup.lst文件。Setup.lst文件是Setup Wizard或PDW制作安装盘时生成的。 8

2. 查找$(DLLSelfRegisterEx)。你将看到在MSCal.ocx的一行中有$(DLLSelfRegisterEx)。 ZN4

3. 修改 $(DLLSelfRegisterEx) 为$(DLLSelfRegister)。 RLcjz

4. 关闭记事本并保存文件。 XJ;'XR

?虚5.运行Setup.exe。 s?

如果希望今后生成的Setup.exe都不出这样的错误,可以这样做: >_Ab

1. 使用记事本打开MSCal.dep文件。你可以在MSCal.ocx所在的目录(通常是Windows 95/98的Windows\System或Windows NT的Winnt\System32)找到MSCal.dep文件。 Q

2. 查找$(DLLSelfRegisterEx)。你将可以在“Register=”一行看到$(DLLSelfRegisterEx)。 q#F

?虚 3. 修改 $(DLLSelfRegisterEx) 为$(DLLSelfRegister)。 26 ?虚 4. 关闭记事本并保存文件。 N4

更多相关推荐:
XX小学下学期工作总结范文

XX小学下学期教学工作计划中央“两会”相继召开,在党和国家领导大力重视农村义务教育的大喜日子里。我们又迎来了新的学年,在新学年里,全镇教职工必须认真学习新的教育理念,积极投身于教育教学改革之中,更新教育观念,积…

小学生学期个人学习总结范文

时光飞逝,斗转星移。回首这半年的点点滴滴,朝朝暮暮,心中顿生了许多感触。这半年中经历的每一天,都已在我心中留下了永久的印记,因为这些印记见证我这样一个新生的成长。在过去半年的内,通过不断地学习,我收获了很多。时…

小学学期工作总结

小学学期工作总结本学期根据教育局20xx年工作要点和学校工作目标以学科教学为主要渠道渗透德育教育内容加快课堂教学改革进程全面落实素质教育以提供优质后勤保障为依托工作中坚持安全第一的思想在全校教师不懈地努力下圆满...

小学语文教师个人年度工作总结范文

自从从事教师这一行,当一位好教师就是我的目标。一年来,我始终以勤勤恳恳、踏踏实实的态度来对待我的工作。现在又到年末,现对一年来的工作进行总结。一、思想品德方面:在一年的教育教学工作中我能认真学习国家的有关教育方…

小学班主任工作总结范文

班主任工作是琐碎,繁忙的,然而做好班主任工作是一个好教师的标志,也能从中体验到做教师的快乐。著名的教育改革家魏书生曾这样说过:班级像一个大家庭,同学们如兄弟姐妹般互相关心着、帮助着,互相鼓舞着、照顾着,一起长大…

小学生个人总结范文

这个学期结束了。在这个学期里,老师为我们的学习付出了许多心血,我们也为自己的学习洒下了许多辛勤的汗水。这次期末考试,我的每门功课,都取得了比较好的成绩。总结这个学期的学习,我想,主要有以下几个方面:第一,学习态…

小学生期末自我总结范文

小学生期末自我总结范文总结时光如逝岁月如流一转眼的时光1年的已经过去了在小五学年的末特写此文以一学期的学习好与坏的好与坏都看这一年的努力多少我这一学期的都会在这里展现这一年来在和们关心下通过自身不断努力各方面均...

小学数学教学工作总结范文

教学工作总结冲头完小普世光本学期我承担三年级的数学教学工作由于自己的经验不足能力有限所以始终坚持从各方面严格要求自己积极向其他有教学经验的教师请教工作中结合本校的实际条件和本班学生的实际情况勤勤恳恳兢兢业业的工...

小学期末考试质量分析报告

小学期末考试质量分析报告五分地总校教导处20xx-20xx学年度第二学期小学(1-5年级)期末教学质量检测工作已经结束,这次考试1-5年级由进修校统一出题,各总校组织考试(六年级全旗统考)。本次考试能站在一个宏…

小学党建20xx年度工作总结范文

小学党建20xx年度工作总结范文过去的XX年在xx区委教育局党委的正确领导与关怀下我们xx区实验小学党支部高举邓小平理论伟大旗帜认真践行quot三个代表quot重要思想以科学发展观为指导以quot坚持科学发展完...

小学期末报告册教师评语大全

1看到课堂上你那专注的眼神认真的学习态度老师深深地感到欣慰看到你作业本上那工整的字迹看到你能出色完成老师布置的各项任务老师很喜欢你你的勤奋你的不张扬你的要强继续努力吧你的明天会更美好2聪明善良活泼大方的你一双大...

小学五年级上 语文期末复习总结-错别字

错别字大本

小学学期总结范文(46篇)