前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >ASP.NET AJAX(9)__Profile Service什么是ASP.NET Profile如何使用ASP.NET ProfileProfile ServiceProfile Service预

ASP.NET AJAX(9)__Profile Service什么是ASP.NET Profile如何使用ASP.NET ProfileProfile ServiceProfile Service预

作者头像
小白哥哥
发布于 2018-03-07 03:16:49
发布于 2018-03-07 03:16:49
1.3K00
代码可运行
举报
文章被收录于专栏:技术小讲堂技术小讲堂
运行总次数:0
代码可运行

什么是ASP.NET Profile

  • 可以为每个用户(包括匿名用户)储存信息
  • 通过在Web.config中的配置即可在应用程序中使用
  • 强类型的属性
  • 可以定义属性组
  • 可以通过自定义ProfileProvider来扩充

如何使用ASP.NET Profile

  1. 配置ProfileProvider(可以使用内置的SqlProfileProvider)
  2. 配置Profile的属性
一个使用ASP.NET Profile的示例

首先,运行打开Visual studio 2008命令提示工具(开始——程序——Visual studio 2008——Visual studio Tool)输入指令:aspnet_regsql -A p -sqlexportonly profileset.sql 回车

这样我们就可以在F:\Microsoft Visual Studio\Microsoft Visual Studio 2008\VC下得到一个名为profileset.sql的文件,命令中的“p”就代码ASP.NET 为profile提供的一个数据库的支持

然后我们打开数据库管理器,我电脑里装的Microsoft SQL Server的develop版本,VS2008带的是Express版本,但是在某些功能上限制,比如它限制数据库最大为4G,虽然这在通常情况下已经是够用的了,但是难免我们会遇到一写很大的数据库,比我上回我就遇到一个宝洁公司的一个项目,他的数据库有10G,这种情况下Express版本就有问题了

在数据库管理工具里运行我们刚才得到的SQL文件,我们最好使用数据库的最高权限管理员登陆,以免遇到一些权限上的问题

然后我们会在数据库里发现一个名为aspnetdb的数据库,这个数据库是默认生成的,名字可以是在我们开始使用命令行的时候指定的,

打开这个数据库,我们可以看到四个表(除系统表以外)aspnet_Applications、aspnet_Profile、aspnet_SchemaVersions、aspnet_Users,这些数据表,按照他的名字,我们就可以猜到它的用途啦

然后打开VS中的web.config,在<configuration>节点下添加connectionStrings节点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<connectionStrings>
        <add name="ProfileDatabase" connectionString="Data Source=XIAOYAOJIAN;Initial Catalog=aspnetdb;Persist Security Info=True;User ID=sa;Password=*******"/>
    </connectionStrings>

这个就不多做解释了,学过asp.net的人,估计没一个不明白这个的意思吧

然后,在system.web节点下,添加如下内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<profile enabled="true" defaultProvider="SqlProvider">
            <providers>
                <clear/>
        <!--type表示我们使用的ProfileProvider的类型,connectionStringName指定我们上面配置的connectionString,applicationName表示应用程序的名字,将会体现的数据库中-->
                <add name="SqlProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ProfileDatabase" applicationName="ProfileSample" description="Sample for ASP.NET profile and Profile Service"/>
            </providers>
      <!--配置属性-->
            <properties>
        <!--定义属性,并指定类型-->
                <add name="Name" type="System.String"/>
                <add name="Email" type="System.String"/>
                <add name="Age" type="System.Int32"/>
        <!--定义一个属性组-->
                <group name="Address">
                    <add name="City" type="System.String"/>
                    <add name="Street" type="System.String"/>
                    <add name="PostalCode" type="System.String"/>
                </group>
            </properties>
        </profile>

这里需要注意一点,在每个属性中都有一个allowAnonymous属性,指定是否可为匿名用户使用,默认是false,如果设置为true,则它也可以为一些匿名用户存储一些信息

接下来我们就可以创建也一个页面使用它

前台代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ProfileUsage.aspx.cs" Inherits="Demo08_ProfileUsage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:TextBox ID="txtUsername" runat="server"></asp:TextBox>
        <asp:Button ID="btnLogInOut" runat="server" Height="24px" Text="btnLogIn/Out" Width="113px"
            OnClick="btnLogInOut_Click" />
        <hr />
        Name:<asp:TextBox ID="txtName" runat="server"></asp:TextBox><br />
        Age:<asp:TextBox ID="txtAge" runat="server"></asp:TextBox><br />
        Email:<asp:TextBox ID="txtEmail" runat="server"></asp:TextBox><br />
        City:<asp:TextBox ID="txtCity" runat="server"></asp:TextBox><br />
        Street:<asp:TextBox ID="txtStreet" runat="server"></asp:TextBox><br />
        Postal Code:<asp:TextBox ID="txtPostalCode" runat="server"></asp:TextBox><br />
        <asp:Label ID="lblMessage" runat="server" Text=""></asp:Label><br />
        <asp:Button ID="btnShowProfile" runat="server" Text="Show" OnClick="btnShowProfile_Click" />
        <asp:Button ID="btnSave" runat="server" Text="Save" OnClick="btnSave_Click" />
    </form>
</body>
</html>

后台代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;

public partial class Demo08_ProfileUsage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void btnLogInOut_Click(object sender, EventArgs e)
    {
        if (this.User.Identity.IsAuthenticated)
        {
            this.lblMessage.Text = this.User.Identity.Name + " logout!";
            FormsAuthentication.SignOut();//注销用户
        }
        else
        {
            this.lblMessage.Text = this.txtUsername.Text + " login!";
            FormsAuthentication.SetAuthCookie(this.txtUsername.Text, false);//使用户登陆
        }
    }
    protected void btnShowProfile_Click(object sender, EventArgs e)
    {
        if (this.Profile.Age == 0)//没有profile,这是个不完整的做法,我们只做一个示例用
        {
            this.txtName.Text = "";
            this.txtEmail.Text = "";
            this.txtCity.Text = "";
            this.txtAge.Text = "";
            this.txtPostalCode.Text = "";
            this.txtStreet.Text = "";

            this.lblMessage.Text = this.User.Identity.Name + " No profile!";
        }
        else
        {
            this.txtName.Text = this.Profile.Name;
            this.txtEmail.Text = this.Profile.Email;
            this.txtCity.Text = this.Profile.Address.City;
            this.txtAge.Text = this.Profile.Age.ToString();
            //使用属性组中的内容
            this.txtPostalCode.Text = this.Profile.Address.PostalCode;
            this.txtStreet.Text = this.Profile.Address.Street;

            this.lblMessage.Text = this.User.Identity.Name + " profile loaded!";
        }
    }
    protected void btnSave_Click(object sender, EventArgs e)
    {
        this.Profile.Name = this.txtName.Text;
        this.Profile.Age = Int32.Parse(this.txtAge.Text);
        this.Profile.Email = this.txtEmail.Text;
        this.Profile.Address.City = this.txtCity.Text;
        this.Profile.Address.Street = this.txtStreet.Text;
        this.Profile.Address.PostalCode = this.txtPostalCode.Text;

        this.lblMessage.Text = this.User.Identity.Name + "  profile saved!";
    }
}

验证页面,首先在第一个文本框中属于一个用户名(随意的),点击登陆,输入个人信息,点击SAVE,就可以保存关于这个用户的信息,点击Logout,然后点击SHOW,显示NO PROFILE,然后再登陆刚才那个用户,点击SHOW,则显示个人信息

打开数据库aspnetdb中的aspnet_Applications表,可以看到类似如下内容

在这里我们可以找到我们配置的ApplicationName

然后打开aspnet_Users表,会看到类型如下内容

这里能找到上一个表的ApplicationId,UserName,IsAnonymous等一系列信息这就是我们通过profile设置进来的

保存信息的表,则是存放在了aspnet_Profile这个表里,打开我们可以找到几中存储的方式,可以模糊的看到我们存储的信息,因为它已经通过一种它的规则把它进行了序列化,我们不需要也没必要去读懂它

Profile Service

  • ASP.NET AJAX 1.0提供的Application Service中的一个
  • 另一个是Membership Service
  • .NET Framework 3.5中包含其他的Application Service

使用Profile Service

  • 出于安全性考虑,ASP.NET AJAX的Profile Service在默认情况下是不可用的
  • <profile Service enabled=”true|false" readAccessProperties="prop1,prop2,…" writeAccessProperties="prop1,prop2,…"  />

加载Profile Service

Sys.Services.ProfileService.load(propertyNames,//需要加载的Profile名,null表示全部

loadCompletedCallback,//加载成功的回调函数

failedCallback,//加载失败的回调函数

userContext//可以随意设置的上下文对象

);

function loadCompletedCallback(

number,//本次加载的Profile数量

userContext,//用户随意指定的上下文对象

methodName//即Sys.Services.ProfileService.load

){…}

function failedCallback(

error,//错误对象

userContext,//用户随意指定的上下文对象

methodName//即Sys.Services.ProfileService.load

){…}

获取和修改Profile Service

var properties=Sys.Services.ProfileService.properties;

alert(properties.Name);

alert(properties.Address.City);

……

properties.Address={City:"tianjin",Street:"yashen road",PostalCode:"300350"};

properties.Save(…);

保存Profile Service

Sys.Services.ProfileService.save(

propertyNames,//需要保存的Profile名,null表示全部

saveCompletedCallback,//保存成功的回调函数

failedCallback,//加载失败的回调函数

userContext//这个,还用写吗?

);

function saveCompletedCallback(

number,//本次加载的Profile数量

userContext,

methodName//即Sys.Services.ProfileService.save

){…}

function failedCallback(

error,//错误对象

userContext,

methodName//即Sys.Services.ProfileService.save

){…}

一个使用Proile Service的示例

创建一个名为ProfileService.aspx的页面

前台代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ProfileService.aspx.cs" Inherits="Demo08_ProfileService" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script language="javascript" type="text/javascript">
        function loadProfiles() {
            Sys.Services.ProfileService.load(null, loadCompleted);
        }

        function loadCompleted() {
            var properties = Sys.Services.ProfileService.properties;
            if (properties.Age) {//如果有Profile
                $get("txtName").value = properties.Name;
                $get("txtAge").value = properties.Age;
                $get("txtCity").value = properties.Address.City;
                $get("txtPostalCode").value = properties.Address.PostalCode;
                $get("message").innerHTML = "Profile loaded!";
            }
            else {
                $get("txtName").value = "";
                $get("txtAge").value = "";
                $get("txtCity").value = "";
                $get("txtPostalCode").value = "";
                $get("message").innerHTML = " No Profile";
            }
        }

        function saveProfiles() {
            var properties = Sys.Services.ProfileService.properties;
            properties.Name = $get("txtName").value;
            properties.Age = parseInt($get("txtAge").value, 10);
            properties.Address.City = $get("txtCity").value;
            properties.Address.PostalCode = $get("txtPostalCode").value;

            Sys.Services.ProfileService.save(null,saveCompleted);
        }
        function saveCompleted() {
            $get("message").innerHTML = "profile saved";
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
            
        </asp:ScriptManager>
        
        <asp:TextBox ID="txtUserName" runat="server"></asp:TextBox>
        <asp:Button ID="btnLogIn" runat="server" Text="Login" OnClick="btnLogin_Click" />
        <asp:Button ID="btnLogout" runat="server" Text="Logout" OnClick="btnLogout_Click" />
        <hr />
        
        Name: <input type="text" id="txtName" /><br />
        Age: <input type="text" id="txtAge" /><br />
        Email: <input type="text" id="txtEmail" /><br />
        City: <input type="text" id="txtCity" /><br />
        Street: <input type="text" id="txtStreet" /><br />
        Postal Code: <input type="text" id="txtPostalCode" /><br />
        
        <div id="message" style="color:Red;"></div><br />
        
        <input type="button" value="Show" onclick="loadProfiles()" />
        <input type="button" value="Save" onclick="saveProfiles()" />
    </form>
</body>
</html>

后台代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;

public partial class Demo08_ProfileService : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        
    }
    protected void btnLogin_Click(object sender, EventArgs e)
    {
        FormsAuthentication.SetAuthCookie(this.txtUserName.Text, false);
    }
    protected void btnLogout_Click(object sender, EventArgs e)
    {
        FormsAuthentication.SignOut();
    }
}

然后我们打开web.config进行配置,找到<system.web.extensions>下的<scripting>下的<webServices>,增加以下内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--这里不可以直接写一个属性组,而要把属性组里的属性一一列举出来-->
        <profileService enabled="true" readAccessProperties="Name,Age,Email,Address.City,Address.Street,Address.PostalCode" writeAccessProperties="Name,Age,Email,Address.City,Address.Street,Address.PostalCode"/>

这样,使用方式和之前的一样,但是我们就使用AJAX的方式使用了Profke Service

其他的一些Profile Service属性

  • timeout属性:设置超时时间(Sys.Services.ProfileService.get_timeout()/set_timtout();)
  • defaultLoadCompletedCallback属性
  • defaultSaveCompletedCallback属性
  • defaultFailedCallback属性

Profile Service预加载

AJAX技术是很容易被滥用的,因为我们在对网页进行操作的时候,随便的一鼠标划过效果,可能就会产生一个Round-trip,如果设计上有滥用,则会很大程序上增加了服务端的压力,而且如果设计的不好,有时候不旦没有提高用户体验,反而是降低了,还有呢,就是一个安全性的问题,这个以后会写到,所以就要在合适的时候使用预加载,来减少这种Round-trip

Profile Service预加载的方式就是在ScriptManager中做的一些操作

如果我们要使用这个功能,很简单,只需要在<ScriptManager>中添加类似如下代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<ProfileService LoadProperties="Name, Email, Address.City, Address.Street" />

Profile Service实现方式

Profile Service的功能

  • 使用AJAX方式获取Profile
  • 使用AJAX方式保存Profile

如果没有这个Profile Service,我们要做这些事情,则需要在客户端调用一个Web Service,事实上Profile Service它的内部实现就是这样的,他是对客户端执行服务器端方法给出的一种特殊实现,在调用定义的ASP.NET AJAX程序集上的ProfileService类,最终工作的为以下的三个方法

  • GetAllPropertiesForCurrentUser
  • GetPropertiesForCurrentUser
  • SetPropertiesForCurrentUser

晚二十点二十七

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2011-10-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Workbook工作簿对象基础
大家好,前面已经介绍了常用的range单元格对象和worksheet普通工作表对象,本节开始介绍工作簿workbook对象,首先通过下图回顾一下常用对象的层级关系。
无言之月
2019/10/13
3K0
Workbook工作簿对象方法(二)
大家好,上节介绍过部分工作簿对象的常用方法-创建和打开,本节将继续介绍工作簿对象的激活、保存和关闭方法。
无言之月
2019/10/13
4.9K0
Workbook工作簿对象方法(一)
大家好,前面介绍了工作簿对象的属性,本节开始介绍工作簿对象的常用方法。这些常用方法可以实现平时用手工的新建、打开、激活、保存excel表等功能。
无言之月
2019/10/13
6.7K0
Worksheet工作表对象属性
大家好,本节主要介绍工作表对象的相关属性。上节大部分已经涉及到,下面主要汇总复习下。
无言之月
2019/10/13
2.8K0
Application主程序对象基础
大家好,前面已经介绍了常见的几种VBA对象,包括range单元格对象、worksheet工作表对象和workbook工作簿对象。本节介绍Application主程序对象。
无言之月
2019/10/13
8660
Excel VBA常用功能加载宏——打开活动工作簿所在文件夹
我们在使用电脑的时候,如果打开的窗口太多,任务栏会比较混乱,一般我们就会关闭一些不需要的窗口,比如文件夹等。
xyj
2020/07/28
2.7K0
Excel VBA常用功能加载宏——打开活动工作簿所在文件夹
EXCEL VBA语句集300
        定制模块行为 (1) Option Explicit ‘强制对模块内所有变量进行声明 Option Private Module ‘标记模块为私有,仅对同一工程中其它模块有用,在宏对话框中不显示  Option Compare Text ‘字符串不区分大小写  Option Base 1 ‘指定数组的第一个下标为1 (2) On Error Resume Next ‘忽略错误继续执行VBA代码,避免出现错误消息 (3) On Error GoTo ErrorHandler ‘当错误发生时跳转到过程中的某个位置 (4) On Error GoTo 0 ‘恢复正常的错误提示 (5) Application.DisplayAlerts=False ‘在程序执行过程中使出现的警告框不显示 (6) Application.ScreenUpdating=False ‘关闭屏幕刷新 Application.ScreenUpdating=True ‘打开屏幕刷新 (7) Application.Enable.CancelKey=xlDisabled ‘禁用Ctrl+Break中止宏运行的功能  工作簿 (8) Workbooks.Add() ‘创建一个新的工作簿 (9) Workbooks(“book1.xls”).Activate ‘激活名为book1的工作簿 (10) ThisWorkbook.Save ‘保存工作簿 (11) ThisWorkbook.close ‘关闭当前工作簿 (12) ActiveWorkbook.Sheets.Count ‘获取活动工作薄中工作表数 (13) ActiveWorkbook.name ‘返回活动工作薄的名称 (14) ThisWorkbook.Name ‘返回当前工作簿名称 ThisWorkbook.FullName ‘返回当前工作簿路径和名称 (15) ActiveWindow.EnableResize=False ‘禁止调整活动工作簿的大小 (16) Application.Window.Arrange xlArrangeStyleTiled ‘将工作簿以平铺方式排列 (17) ActiveWorkbook.WindowState=xlMaximized ‘将当前工作簿最大化  工作表 (18) ActiveSheet.UsedRange.Rows.Count ‘当前工作表中已使用的行数 (19) Rows.Count ‘获取工作表的行数(注:考虑向前兼容性) (20) Sheets(Sheet1).Name= “Sum” ‘将Sheet1命名为Sum (21) ThisWorkbook.Sheets.Add Before:=Worksheets(1) ‘添加一个新工作表在第一工作表前 (22) ActiveSheet.Move After:=ActiveWorkbook. _ Sheets(ActiveWorkbook.Sheets.Count) ‘将当前工作表移至工作表的最后 (23) Worksheets(Array(“sheet1”,”sheet2”)).Select ‘同时选择工作表1和工作表2 (24) Sheets(“sheet1”).Delete或 Sheets(1).Delete ‘删除工作表1 (25) ActiveWorkbook.Sheets(i).Name ‘获取工作表i的名称 (26) ActiveWindow.DisplayGridlines=Not ActiveWindow.DisplayGridlines ‘切换工作表中的网格线显示,这种方法也可以用在其它方面进行相互切换,即相当于开关按钮 (27) ActiveWindow.DisplayHeadings=Not ActiveWindow.DisplayHeadings ‘切换工作表中的行列边框显示 (28) ActiveSheet.UsedRange.FormatConditions.Delete ‘删除当前工作表中所有的条件格式 (29) Cells.Hyperlinks.Delete ‘取消当前工作表所有超链接 (30) ActiveSheet.PageSetup.Orientation=xlLandscape 或ActiveSheet.PageSetup.Orientation=2 ‘将页面设置更改为横向 (31) ActiveSheet.PageSetup.RightFooter=ActiveWorkbook.FullName ‘在页面设置的表尾中输入文件路径 ActiveSheet.PageSetup.Le
Tony老师
2020/03/05
2K0
Excel应用实践10:合并多个工作簿中的数据
我有超过50个具有相同格式的Excel文件,它们的列标题相同,并且都放置在同一文件夹,有什么快速的方法将它们合并到一个单独的Excel文件的一个工作表中?
fanjy
2019/07/19
2.3K0
Application主程序对象方法(四)
大家好,本节将介绍Application对象的GetSaveAsFilename方法,以及介绍如何让Excel程序说话。
无言之月
2019/10/13
1.6K0
文科生也能学会的Excel VBA 宏编程入门(三)——合并文件
在日常工作中,我们经常会遇到需要汇总多个表格的数据,将它们合并到一个表格里的情况。虽然复制粘贴大法好,但如果让你汇总几十人填报的个人信息并做成汇总表格,估计你也膜不动了。因此,这一次我们就通过VBA程序完成这个任务,从此妈妈再也不担心我数数到头秃。
全栈程序员站长
2022/09/02
3.9K0
Worksheet工作表对象基础
大家好,前面介绍了最常用的单元格Range对象,本节开始介绍Worksheet工作表对象的相关内容(基础内容已有涉及),后续会再分别介绍它的属性、方法以及事件等内容。
无言之月
2019/10/13
2.7K0
Excel编程周末速成班第3课:Excel对象模型
导语:为了帮助想要快速学会Excel VBA的朋友,特以《Excel Programming Weekend Crash Course》这本书为基础,开始整理一系列资料,在完美Excel社群上分享。一共有30课,本文为第3课,目前已在社群上发布4课。有兴趣的朋友可以到社群上学习。
fanjy
2020/11/06
5.2K0
matinal:Excel用VBA代码一键合并汇总多个工作簿
有时候,你需要将几十个工作簿中的内容,快速汇总至合并至一个工作簿,如果手动一个复制粘贴,那心里有苦说不出。。。
matinal
2023/11/21
1.1K1
matinal:Excel用VBA代码一键合并汇总多个工作簿
Application主程序对象属性
大家好,上节介绍application主程序对象的基础内容,介绍了可以返回常用对象的属性,本节介绍其他常用属性。
无言之月
2019/10/13
2K0
常用功能加载宏——多个工作簿合并到一个工作簿
对于做管理工作的,收集表格这种工作应该会经常有,设计一个表格模板,发给各个有关单位去填写,收集起来后再合并到一起。
xyj
2020/07/28
1.9K0
常用功能加载宏——多个工作簿合并到一个工作簿
Worksheet工作表对象方法
两段代码中activate和select方法的结果相同。都是将workshets(1)工作表对象激活。
无言之月
2019/10/13
2.2K0
VBA实战技巧32:安装Excel加载宏
我们知道,有多种方法可以进入“Excel加载宏”对话框。最简单的就是,单击功能区“开发工具”选项卡“加载项”组中的“Excel加载项”,即可打开如下图1所示的的“加载宏”对话框。
fanjy
2021/08/31
5.6K0
VBA实战技巧32:安装Excel加载宏
VBA实用小程序62: 获取文件夹中最新保存的工作簿
在有些情形下,我们可能需要找到指定文件夹中最新保存的工作簿,然后对其进行处理。例如,每天上班前系统会自动生成一个工作簿并保存到某文件夹中,而某位员工每天上班后需要从该文件夹中打开这个新生成的工作簿来提取数据,这样程序需要根据工作簿保存的时间找到这个最新保存的工作簿,然后再对其进行处理。
fanjy
2020/03/31
1.5K0
Excel事件(三)工作簿事件
大家好,上节介绍工作表事件,本节将介绍工作簿事件,工作簿数量较多,但并没有工作表事件常用,只简单介绍几个常用的工作簿事件。
无言之月
2019/10/13
2.3K0
VBA常用程序——每个表都应该有
Sub 复制位图() Selection.CopyPicture Appearance:=xlScreen, Format:=xlBitmap End Sub Sub 复制打印() Range("Print_Area").CopyPicture Appearance:=xlScreen, Format:=xlBitmap End Sub Sub 清除图片() For Each shp In ActiveSheet.Shapes If shp.Type = 13 Then shp.Delete
林万程
2018/06/26
1K0
相关推荐
Workbook工作簿对象基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验