精华内容
下载资源
问答
  • 关于多个程序同时操作一个发生死锁的问题
    千次阅读
    2021-01-19 07:13:15

    锁的概述

    一. 为什么要引入锁

    多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:

    丢失更新

    A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统

    脏读

    A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致

    不可重复读

    A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致

    并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致

    二 锁的分类

    锁的类别有两种分法:

    1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁

    MS SQL Server 使用以下资源锁模式。

    锁模式 描述

    共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。

    更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。

    排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。

    意向锁 用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。

    架构锁 在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。

    大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。

    共享锁

    共享

    (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S)

    锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (S)

    锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。

    更新锁

    更新

    (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S)

    锁,然后修改行,此操作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它

    (X) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X)

    锁以进行更新。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。

    若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。

    排它锁

    排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。

    意向锁

    意向锁表示

    SQL Server 需要在层次结构中的某些底层资源上获取共享 (S) 锁或排它 (X)

    锁。例如,放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享 (S) 锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它

    (X) 锁。意向锁可以提高性能,因为 SQL Server

    仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。

    意向锁包括意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。

    锁模式

    描述

    意向共享 (IS) 通过在各资源上放置 S 锁,表明事务的意向是读取层次结构中的部分(而不是全部)底层资源。

    意向排它

    (IX) 通过在各资源上放置 X 锁,表明事务的意向是修改层次结构中的部分(而不是全部)底层资源。IX 是 IS 的超集。与意向排它共享

    (SIX) 通过在各资源上放置 IX 锁,表明事务的意向是读取层次结构中的全部底层资源并修改部分(而不是全部)底层资源。允许顶层资源上的并发

    IS 锁。例如,表的 SIX 锁在表上放置一个 SIX 锁(允许并发 IS 锁),在当前所修改页上放置 IX 锁(在已修改行上放置 X

    锁)。虽然每个资源在一段时间内只能有一个 SIX 锁,以防止其它事务对资源进行更新,但是其它事务可以通过获取表级的 IS

    锁来读取层次结构中的底层资源。

    独占锁:只允许进行锁定操作的程序使用,其他任何对他的操作均不会被接受。执行数据更新命令时,SQL Server会自动使用独占锁。当对象上有其他锁存在时,无法对其加独占锁。

    共享锁:共享锁锁定的资源可以被其他用户读取,但其他用户无法修改它,在执行Select时,SQL Server会对对象加共享锁。

    更新锁:当SQL Server准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server确定要进行更新数据操作时,他会自动将更新锁换为独占锁,当对象上有其他锁存在时,无法对其加更新锁。

    2. 从程序员的角度看:分为乐观锁和悲观锁。

    乐观锁:完全依靠数据库来管理锁的工作。

    悲观锁:程序员自己管理数据或对象上的锁处理。

    MS SQL Server 使用锁在多个同时在数据库内执行修改的用户间实现悲观并发控制

    三 锁的粒度

    锁粒度是被封锁目标的大小,封锁粒度小则并发性高,但开销大,封锁粒度大则并发性低但开销小

    SQL Server支持的锁粒度可以分为为行、页、键、键范围、索引、表或数据库获取锁

    资源描述

    RID 行标识符。用于单独锁定表中的一行。

    键 索引中的行锁。用于保护可串行事务中的键范围。

    页 8 千字节 (KB) 的数据页或索引页。

    扩展盘区 相邻的八个数据页或索引页构成的一组。

    表 包括所有数据和索引在内的整个表。

    DB 数据库。

    四 锁定时间的长短

    锁保持的时间长度为保护所请求级别上的资源所需的时间长度。

    用于保护读取操作的共享锁的保持时间取决于事务隔离级别。采用

    READ COMMITTED 的默认事务隔离级别时,只在读取页的期间内控制共享锁。在扫描中,直到在扫描内的下一页上获取锁时才释放锁。如果指定

    HOLDLOCK 提示或者将事务隔离级别设置为 REPEATABLE READ 或 SERIALIZABLE,则直到事务结束才释放锁。

    根据为游标设置的并发选项,游标可以获取共享模式的滚动锁以保护提取。当需要滚动锁时,直到下一次提取或关闭游标(以先发生者为准)时才释放滚动锁。但是,如果指定 HOLDLOCK,则直到事务结束才释放滚动锁。

    用于保护更新的排它锁将直到事务结束才释放。

    如果一个连接试图获取一个锁,而该锁与另一个连接所控制的锁冲突,则试图获取锁的连接将一直阻塞到:

    将冲突锁释放而且连接获取了所请求的锁。

    连接的超时间隔已到期。默认情况下没有超时间隔,但是一些应用程序设置超时间隔以防止无限期等待

    五 SQL Server 中锁的自定义

    1 处理死锁和设置死锁优先级

    死锁就是多个用户申请不同封锁,由于申请者均拥有一部分封锁权而又等待其他用户拥有的部分封锁而引起的无休止的等待可以使用SET

    DEADLOCK_PRIORITY控制在发生死锁情况时会话的反应方式。如果两个进程都锁定数据,并且直到其它进程释放自己的锁时,每个进程才能释放自己的锁,即发生死锁情况。

    2 处理超时和设置锁超时持续时间。

    @@LOCK_TIMEOUT 返回当前会话的当前锁超时设置,单位为毫秒

    SET LOCK_TIMEOUT 设置允许应用程序设置语句等待阻塞资源的最长时间。当语句等待的时间大于 LOCK_TIMEOUT 设置时,系统将自动取消阻塞的语句,并给应用程序返回"已超过了锁请求超时时段"的 1222 号错误信息

    示例

    下例将锁超时期限设置为 1,800 毫秒。

    SET LOCK_TIMEOUT 1800

    3) 设置事务隔离级别。

    4 ) 对 SELECT、INSERT、UPDATE 和 DELETE 语句使用表级锁定提示。

    5) 配置索引的锁定粒度

    可以使用 sp_indexoption 系统存储过程来设置用于索引的锁定粒度

    六 查看锁的信息   1 执行 EXEC SP_LOCK 报告有关锁的信息

    2 查询分析器中按Ctrl+2可以看到锁的信息

    七 使用注意事项

    如何避免死锁

    1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务;

    2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂;

    3 优化程序,检查并避免死锁现象出现;

    4 .对所有的脚本和SP都要仔细测试,在正是版本之前。

    5 所有的SP都要有错误处理(通过@error)

    6 一般不要修改SQL Server事务的默认级别。不推荐强行加锁

    八 几个有关锁的问题

    1 如何锁一个表的某一行

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDSELECT * FROM table ROWLOCK WHERE id =

    1

    2 锁定数据库的一个表

    SELECT * FROM table WITH (HOLDLOCK)

    加锁语句:

    sybase:update 表 set col1=col1 where 1=0 ;MS SQL:select col1 from 表 (tablockx) where 1=0 ;oracle:LOCK TABLE 表 IN EXCLUSIVE MODE ;

    加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁

    几个例子帮助大家加深印象,设table1(A,B,C)

    A B C

    a1 b1 c1

    a2 b2 c2

    a3 b3 c3

    1)排它锁

    新建两个连接,在第一个连接中执行以下语句

    begin tranupdate table1set A='aa'where B='b2'waitfor delay '00:00:30'

    --等待30秒commit tran

    在第二个连接中执行以下语句

    begin transelect * from table1where B='b2'commit tran

    若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒

    2)共享锁

    在第一个连接中执行以下语句

    begin transelect * from table1 holdlock -holdlock人为加锁where B='b2'waitfor delay '00:00:30'

    --等待30秒commit tran

    在第二个连接中执行以下语句

    begin transelect A,C from table1where B='b2'update table1set A='aa'where B='b2'commit tran

    若同时执行上述两个语句,则第二个连接中的select查询可以执行,而update必须等待第一个事务释放共享锁转为排它锁后才能执行 即要等待30秒

    3)死锁

    增设table2(D,E)

    D E

    d1 e1

    d2 e2

    在第一个连接中执行以下语句

    begin tranupdate table1set A='aa'where B='b2'waitfor delay '00:00:30'update table2set D='d5'where E='e1'commit tran

    在第二个连接中执行以下语句

    begin tranupdate table2set D='d5'where E='e1'waitfor delay '00:00:10'update table1set A='aa'where B='b2'commit tran

    同时执行,系统会检测出死锁,并中止进程

    补充一点:

    SQL Server 2000支持的表级锁定提示

    HOLDLOCK 持有共享锁,直到整个事务完成,应该在被锁对象不需要时立即释放,等于SERIALIZABLE事务隔离级别

    NOLOCK 语句执行时不发出共享锁,允许脏读 ,等于 READ UNCOMMITTED事务隔离级别

    PAGLOCK 在使用一个表锁的地方用多个页锁

    READPAST 让SQL Server跳过任何锁定行,执行事务,适用于READ UNCOMMITTED事务隔离级别只跳过RID锁,不跳过页,区域和表锁

    ROWLOCK 强制使用行锁

    TABLOCKX 强制使用独占表级锁,这个锁在事务期间阻止任何其他事务使用这个表

    UPLOCK 强制在读表时使用更新而不用共享锁

    应用程序锁:

    应用程序锁就是客户端代码生成的锁,而不是SQL Server本身生成的锁

    处理应用程序锁的两个过程

    sp_getapplock 锁定应用程序资源

    sp_releaseapplock 为应用程序资源解锁

    注意: 锁定数据库的一个表的区别

    SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除

    SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除

    更多相关内容
  • MySQL表锁定--读写锁

    千次阅读 2018-08-02 17:14:17
    MySQL允许客户端会话明确...在详细介绍之前,我们将创建一名为sampledb的示例数据库,其中包含一简单的tbl来模拟练习表锁定语句。 CREATE DATABASE IF NOT EXISTS testdb; USE testdb; CREATE TABLE tbl ...

    MySQL允许客户端会话明确获取表锁,以防止其他会话在特定时间段内访问表。客户端会话只能为自己获取或释放表锁。它不能获取或释放其他会话的表锁。

    在详细介绍之前,我们将创建一个名为sampledb的示例数据库,其中包含一个简单的tbl表来模拟练习表锁定语句。

    CREATE DATABASE IF NOT EXISTS testdb;
    
    USE testdb;
    CREATE TABLE tbl (
      id int(11) NOT NULL AUTO_INCREMENT,
      col int(11) NOT NULL,
      PRIMARY KEY (id)
    );
    

     

    LOCK和UNLOCK TABLES语法

    获取表的锁的简单形式如下:

    LOCK TABLES table_name [READ | WRITE]
    

     

    可将表的名称放在LOCK TABLES关键字后面,后跟一个锁类型。 MySQL提供两种锁类型:READWRITE。 我们将在下一节详细介绍这两种锁类型。

    要释放表的锁,请使用以下语句:

    UNLOCK TABLES;
    

     

    表锁定为READ

    表的READ锁具有以下功能:

    • 同时可以通过多个会话获取表的READ锁。此外,其他会话可以从表中读取数据,而无需获取锁定。
    • 持有READ锁的会话只能从表中读取数据,但不能写入。此外,其他会话在释放READ锁之前无法将数据写入表中。来自另一个会话的写操作将被放入等待状态,直到释放READ锁。
    • 如果会话正常或异常终止,MySQL将会隐式释放所有锁。这也与WRITE锁相关。

    下面我们来看看在以下情况下READ锁如何工作。

    首先,连接到testdb数据库。要查找当前的连接ID,请使用CONNECTION_ID()函数,如下所示:

    mysql> SELECT CONNECTION_ID();
    +-----------------+
    | CONNECTION_ID() |
    +-----------------+
    |               6 |
    +-----------------+
    1 row in set
    

     

    然后,在向tbl表中插入一个新行

    INSERT INTO tbl(col) VALUES(10);
    

     

    接下来,从上表tbl中检索所有行。

    mysql> SELECT * FROM tbl;
    +----+-----+
    | id | col |
    +----+-----+
    |  1 |  10 |
    +----+-----+
    1 row in set
    

     

    之后,要获取锁,可以使用LOCK TABLE语句。
    最后,在同一个会话中,如果您尝试在tbl表中插入一个新行,将收到一条错误消息。

    mysql> LOCK TABLE tbl READ;
    Query OK, 0 rows affected
    
    mysql> INSERT INTO tbl(col) VALUES(11);
    1099 - Table 'tbl' was locked with a READ lock and can't be updated
    mysql>
    

     

    所以一旦获得了READ锁定,就不能在同一个会话中的表中写入数据。让我们从不同的会话中来查看READ锁。

    首先,打开另一个终端并连接到数据库testdb,然后检查连接ID:

    mysql> SELECT CONNECTION_ID();
    +-----------------+
    | CONNECTION_ID() |
    +-----------------+
    |               7 |
    +-----------------+
    1 row in set
    

     

    然后,从tbl检索数据,如下所示 -

    mysql> SELECT * FROM tbl;
    +----+-----+
    | id | col |
    +----+-----+
    |  1 |  10 |
    +----+-----+
    1 row in set
    

     

    接下来,从第二个会话(会话ID为7)插入一个新行到tbl表中。

    第二个会话的插入操作处于等待状态,因为第一个会话已经在tbl表上获取了一个READ锁,并且尚未释放。

    可以使用SHOW PROCESSLIST语句查看详细信息,如下所示 -

    mysql> SHOW PROCESSLIST;
    +----+------+-----------------+----------+---------+------+---------------------------------+---------------------------------+
    | Id | User | Host            | db       | Command | Time | State                           | Info                            |
    +----+------+-----------------+----------+---------+------+---------------------------------+---------------------------------+
    |  2 | root | localhost:51998 | NULL     | Sleep   |  474 |                                 | NULL                            |
    |  3 | root | localhost:51999 | yiibaidb | Sleep   | 3633 |                                 | NULL                            |
    |  6 | root | localhost:52232 | testdb   | Query   |    0 | starting                        | SHOW PROCESSLIST                |
    |  7 | root | localhost:53642 | testdb   | Query   |  110 | Waiting for table metadata lock | INSERT INTO tbl(col) VALUES(20) |
    +----+------+-----------------+----------+---------+------+---------------------------------+---------------------------------+
    4 rows in set
    

     

    之后,返回第一个会话并使用UNLOCK TABLES语句来释放锁。从第一个会话释放READ锁之后,在第二个会话中执行INSERT操作。

    最后,查看tbl表中的数据,以查看第二个会话中的INSERT操作是否真的执行。

    mysql> SELECT * FROM tbl;
    +----+-----+
    | id | col |
    +----+-----+
    |  1 |  10 |
    |  2 |  20 |
    +----+-----+
    2 rows in set
    

     

    将MySQL表锁定WRITE

    表锁为WRITE具有以下功能:

    • 只有拥有表锁定的会话才能从表读取和写入数据。
    • 在释放WRITE锁之前,其他会话不能从表中读写。

    详细了解WRITE锁的工作原理。

    首先,从第一个会话获取一个WRITE锁。

    LOCK TABLE tbl WRITE;
    

     

    然后,在tbl表中插入一个新行。

    INSERT INTO tbl(col) VALUES(11);
    

     

    没有问题,上面语句可能正常执行。接下来,从tbl表读取数据。

    mysql> SELECT * FROM tbl;
    +----+-----+
    | id | col |
    +----+-----+
    |  1 |  10 |
    |  2 |  20 |
    |  3 |  11 |
    +----+-----+
    3 rows in set
    

     

    之后,打开第二个连接到MySQL的会话,尝试写和读数据:

    MySQL将这些操作置于等待状态。可以在第一个会话中,使用SHOW PROCESSLIST语句来查看它。

    mysql> SHOW PROCESSLIST;
    +----+------+-----------------+----------+---------+-------+---------------------------------+---------------------------------+
    | Id | User | Host            | db       | Command | Time  | State                           | Info                            |
    +----+------+-----------------+----------+---------+-------+---------------------------------+---------------------------------+
    |  2 | root | localhost:51998 | NULL     | Sleep   |  8477 |                                 | NULL                            |
    |  3 | root | localhost:51999 | yiibaidb | Sleep   | 11636 |                                 | NULL                            |
    |  8 | root | localhost:54012 | testdb   | Sleep   |   119 |                                 | NULL                            |
    |  9 | root | localhost:54013 | testdb   | Query   |     0 | starting                        | SHOW PROCESSLIST                |
    | 10 | root | localhost:54016 | testdb   | Query   |    49 | Waiting for table metadata lock | INSERT INTO tbl(col) VALUES(21) |
    +----+------+-----------------+----------+---------+-------+---------------------------------+---------------------------------+
    5 rows in set
    

     

    最后,从第一个会话释放锁。执行以下语句 -

    UNLOCK TABLES;
    

     

    执行上面语句后,将看到第二个会话中的所有待处理已经执行操作。

    SELECT * FROM tbl;
    Query OK, 1 row affected
    
    +----+-----+
    | id | col |
    +----+-----+
    |  1 |  10 |
    |  2 |  20 |
    |  3 |  11 |
    |  4 |  21 |
    +----+-----+
    4 rows in set
    

     

    展开全文
  • 今天从网上学到如何破解vba工程密码以及工作表保护密码,在这里分享一下。 破解vba工程密码:(引用自http://jingyan.baidu.com/article/2009576170cc05cb0721b437.html) 1.将你要破解的Excel文件关闭,切记一定要...

    今天从网上学到如何破解vba工程密码以及工作表保护密码,在这里分享一下。 
    破解vba工程密码:(引用自http://jingyan.baidu.com/article/2009576170cc05cb0721b437.html

    1.将你要破解的Excel文件关闭,切记一定要关闭呀!然后新建一个Excel文件:

    这里写图片描述

    2.打开新建的这个Excel,按下alt+F11,打开vb界面,新建一个模块,如图所示:

    这里写图片描述

    3.将代码复制到这个模块中,代码如下:

    Private Sub VBAPassword() '你要解保护的Excel文件路径
    Filename = Application.GetOpenFilename("Excel文件(*.xls & *.xla & *.xlt),*.xls;*.xla;*.xlt", , "VBA破解")
    If Dir(Filename) = "" Then
    MsgBox "没找到相关文件,清重新设置。"
    Exit Sub
    Else
    FileCopy Filename, Filename & ".bak" '备份文件。
    End If
    Dim GetData As String * 5
    Open Filename For Binary As #1
    Dim CMGs As Long
    Dim DPBo As Long
    For i = 1 To LOF(1)
    Get #1, i, GetData
    If GetData = "CMG=""" Then CMGs = i
    If GetData = "[Host" Then DPBo = i - 2: Exit For
    Next
    If CMGs = 0 Then
    MsgBox "请先对VBA编码设置一个保护密码...", 32, "提示"
    Exit Sub
    End If
    
    Dim St As String * 2
    Dim s20 As String * 1
    '取得一个0D0A十六进制字串
    Get #1, CMGs - 2, St
    '取得一个20十六制字串
    Get #1, DPBo + 16, s20
    '替换加密部份机码
    For i = CMGs To DPBo Step 2
    Put #1, i, St
    Next
    '加入不配对符号
    If (DPBo - CMGs) Mod 2 <> 0 Then
    Put #1, DPBo + 1, s20
    End If
    MsgBox "文件解密成功......", 32, "提示"
    Close #1
    End Sub

     

    这里写图片描述

    4.然后点击运行按钮,如图所示,绿色的小三角就是:

    这里写图片描述

    5.你会看到,打开了一个文件夹,找到我们要破解的这个文件,然后点击打开:

    这里写图片描述

    6.稍等几分钟你就会看到破解成功的提示了:

    这里写图片描述

    7.再次打开你要破解的这个文件,你会看到这里已经可以查看代码了:

    这里写图片描述

    工作表保护密码破解(引用自:https://www.fghrsh.net/post/15.html

    1.点击文件-选项-自定义功能区,找到“开发工具”勾选并确定:

    这里写图片描述

    2.进去找到“录制宏”,把它创建在“个人宏工作簿”:

    这里写图片描述

    3.创建好后什么都不用动,直接“停止录制”,然后点击“Visual Basic”:

    这里写图片描述 
    这里写图片描述

    4.在左边导航栏找到“模块一”,并双击打开:

    这里写图片描述

    5.删掉里面所有内容,把破解代码替换进去,并保存(切记):

    Public Sub 工作表保护密码破解()
    Const DBLSPACE As String = vbNewLine & vbNewLine
    Const AUTHORS As String = DBLSPACE & vbNewLine & _
    "作者:McCormick   JE McGimpsey "
    Const HEADER As String = "工作表保护密码破解"
    Const VERSION As String = DBLSPACE & "版本 Version 1.1.1"
    Const REPBACK As String = DBLSPACE & ""
    Const ZHENGLI As String = DBLSPACE & "                        FGHRSH 整理"
    Const ALLCLEAR As String = DBLSPACE & "该工作簿中的工作表密码保护已全部解除!!" & DBLSPACE & "请记得另保存" _
    & DBLSPACE & "注意:不要用在不当地方,要尊重他人的劳动成果!"
    Const MSGNOPWORDS1 As String = "该文件工作表中没有加密"
    Const MSGNOPWORDS2 As String = "该文件工作表中没有加密2"
    Const MSGTAKETIME As String = "解密需花费一定时间,请耐心等候!" & DBLSPACE & "按确定开始破解!"
    Const MSGPWORDFOUND1 As String = "密码重新组合为:" & DBLSPACE & "$$" & DBLSPACE & _
    "如果该文件工作表有不同密码,将搜索下一组密码并修改清除"
    Const MSGPWORDFOUND2 As String = "密码重新组合为:" & DBLSPACE & "$$" & DBLSPACE & _
    "如果该文件工作表有不同密码,将搜索下一组密码并解除"
    Const MSGONLYONE As String = "确保为唯一的?"
    Dim w1 As Worksheet, w2 As Worksheet
    Dim i As Integer, j As Integer, k As Integer, l As Integer
    Dim m As Integer, n As Integer, i1 As Integer, i2 As Integer
    Dim i3 As Integer, i4 As Integer, i5 As Integer, i6 As Integer
    Dim PWord1 As String
    Dim ShTag As Boolean, WinTag As Boolean
    Application.ScreenUpdating = False
    With ActiveWorkbook
    WinTag = .ProtectStructure Or .ProtectWindows
    End With
    ShTag = False
    For Each w1 In Worksheets
    ShTag = ShTag Or w1.ProtectContents
    Next w1
    If Not ShTag And Not WinTag Then
    MsgBox MSGNOPWORDS1, vbInformation, HEADER
    Exit Sub
    End If
    MsgBox MSGTAKETIME, vbInformation, HEADER
    If Not WinTag Then
    Else
    On Error Resume Next
    Do 'dummy do loop
    For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
    For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
    For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
    For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
    With ActiveWorkbook
    .Unprotect Chr(i) & Chr(j) & Chr(k) & _
    Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
    Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
    If .ProtectStructure = False And _
    .ProtectWindows = False Then
    PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
    Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
    Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
    MsgBox Application.Substitute(MSGPWORDFOUND1, _
    "$$", PWord1), vbInformation, HEADER
    Exit Do 'Bypass all for...nexts
    End If
    End With
    Next: Next: Next: Next: Next: Next
    Next: Next: Next: Next: Next: Next
    Loop Until True
    On Error GoTo 0
    End If
    If WinTag And Not ShTag Then
    MsgBox MSGONLYONE, vbInformation, HEADER
    Exit Sub
    End If
    On Error Resume Next
    For Each w1 In Worksheets
    'Attempt clearance with PWord1
    w1.Unprotect PWord1
    Next w1
    On Error GoTo 0
    ShTag = False
    For Each w1 In Worksheets
    'Checks for all clear ShTag triggered to 1 if not.
    ShTag = ShTag Or w1.ProtectContents
    Next w1
    If ShTag Then
    For Each w1 In Worksheets
    With w1
    If .ProtectContents Then
    On Error Resume Next
    Do 'Dummy do loop
    For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
    For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
    For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
    For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
    .Unprotect Chr(i) & Chr(j) & Chr(k) & _
    Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
    Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
    If Not .ProtectContents Then
    PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
    Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
    Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
    MsgBox Application.Substitute(MSGPWORDFOUND2, _
    "$$", PWord1), vbInformation, HEADER
    'leverage finding Pword by trying on other sheets
    For Each w2 In Worksheets
    w2.Unprotect PWord1
    Next w2
    Exit Do 'Bypass all for...nexts
    End If
    Next: Next: Next: Next: Next: Next
    Next: Next: Next: Next: Next: Next
    Loop Until True
    On Error GoTo 0
    End If
    End With
    Next w1
    End If
    MsgBox ALLCLEAR & AUTHORS & VERSION & REPBACK & ZHENGLI, vbInformation, HEADER
    End Sub

     

    这里写图片描述

    6.关掉刚刚的“Visual Basic”窗口,点击“宏”:

    这里写图片描述

    7.点击刚刚导入的破解宏,并执行(打开了多个工作簿可在位置选择需要的):

    这里写图片描述

    8.开始破解,“确定”

    这里写图片描述

    9.至此,密码已经全部破解完成

    这里写图片描述 
    这里写图片描述

    展开全文
  • 把这些掌握就差不多了一、建立分类下拉列表填充项我们常常要将企业的名称输入到表格中,为了保持名称的一致性,利用“数据有效性”功能建了一分类下拉列表填充项。1.在Sheet2中,将企业名称按类别(如“工业企业”...

    把这些掌握就差不多了

    一、建立分类下拉列表填充项

    我们常常要将企业的名称输入到表格中,为了保持名称的一致性,利用“数据有效性”功能建了一个分类下拉列表填充项。

    1.在Sheet2中,将企业名称按类别(如“工业企业”、“商业企业”、“个体企业”等)分别输入不同列中,建立一个企业名称数据库。

    2.选中A列(“工业企业”名称所在列),在“名称”栏内,输入“工业企业”字符后,按“回车”键进行确认。

    仿照上面的操作,将B、C……列分别命名为“商业企业”、“个体企业”……

    3.切换到Sheet1中,选中需要输入“企业类别”的列(如C列),执行“数据→有效性”命令,打开“数据有效性”对话框。在“设置”标签中,单击“允许”右侧的下拉按钮,选中“序列”选项,在下面的“来源”方框中,输入“工业企业”,“商业企业”,“个体企业”……序列(各元素之间用英文逗号隔开),确定退出。

    再选中需要输入企业名称的列(如D列),再打开“数据有效性”对话框,选中“序列”选项后,在“来源”方框中输入公式:=INDIRECT(C1),确定退出。

    4.选中C列任意单元格(如C4),单击右侧下拉按钮,选择相应的“企业类别”填入单元格中。然后选中该单元格对应的D列单元格(如D4),单击下拉按钮,即可从相应类别的企业名称列表中选择需要的企业名称填入该单元格中。

    提示:在以后打印报表时,如果不需要打印“企业类别”列,可以选中该列,右击鼠标,选“隐藏”选项,将该列隐藏起来即可。

    二、建立“常用文档”新菜单

    在菜单栏上新建一个“常用文档”菜单,将常用的工作簿文档添加到其中,方便随时调用。

    1.在工具栏空白处右击鼠标,选“自定义”选项,打开“自定义”对话框。在“命令”标签中,选中“类别”下的“新菜单”项,再将“命令”下面的“新菜单”拖到菜单栏。

    按“更改所选内容”按钮,在弹出菜单的“命名”框中输入一个名称(如“常用文档”)。 2.再在“类别”下面任选一项(如“插入”选项),在右边“命令”下面任选一项(如“超链接”选项),将它拖到新菜单(常用文档)中,并仿照上面的操作对它进行命名(如“工资表”等),建立第一个工作簿文档列表名称。

    重复上面的操作,多添加几个文档列表名称。

    3.选中“常用文档”菜单中某个菜单项(如“工资表”等),右击鼠标,在弹出的快捷菜单中,选“分配超链接→打开”选项,打开“分配超链接”对话框。通过按“查找范围”右侧的下拉按钮,定位到相应的工作簿(如“工资.xls”等)文件夹,并选中该工作簿文档。

    重复上面的操作,将菜单项和与它对应的工作簿文档超链接起来。

    4.以后需要打开“常用文档”菜单中的某个工作簿文档时,只要展开“常用文档”菜单,单击其中的相应选项即可。

    提示:尽管我们将“超链接”选项拖到了“常用文档”菜单中,但并不影响“插入”菜单中“超链接”菜单项和“常用”工具栏上的“插入超链接”按钮的功能。

    三、让不同类型数据用不同颜色显示

    在工资表中,如果想让大于等于2000元的工资总额以“红色”显示,大于等于1500元的工资总额以“蓝色”显示,低于1000元的工资总额以“棕色”显示,其它以“黑色”显示,我们可以这样设置。

    1.打开“工资表”工作簿,选中“工资总额”所在列,执行“格式→条件格式”命令,打开“条件格式”对话框。单击第二个方框右侧的下拉按钮,选中“大于或等于”选项,在后面的方框中输入数值“2000”。单击“格式”按钮,打开“单元格格式”对话框,将“字体”的“颜色”设置为“红色”。

    2.按“添加”按钮,并仿照上面的操作设置好其它条件(大于等于1500,字体设置为“蓝色”;小于1000,字体设置为“棕色”)。

    3.设置完成后,按下“确定”按钮。 看看工资表吧,工资总额的数据是不是按你的要求以不同颜色显示出来了。

    四、制作“专业符号”工具栏

    在编辑专业表格时,常常需要输入一些特殊的专业符号,为了方便输入,我们可以制作一个属于自己的“专业符号”工具栏。

    1.执行“工具→宏→录制新宏”命令,打开“录制新宏”对话框,输入宏名如“fuhao1”并将宏保存在“个人宏工作簿”中,然后“确定”开始录制。选中“录制宏”工具栏上的“相对引用”按钮,然后将需要的特殊符号输入到某个单元格中,再单击“录制宏”工具栏上的“停止”按钮,完成宏的录制。

    仿照上面的操作,一一录制好其它特殊符号的输入“宏”。

    2.打开“自定义”对话框,在“工具栏”标签中,单击“新建”按钮,弹出“新建工具栏”对话框,输入名称——“专业符号”,确定后,即在工作区中出现一个工具条。

    切换到“命令”标签中,选中“类别”下面的“宏”,将“命令”下面的“自定义按钮”项拖到“专业符号”栏上(有多少个特殊符号就拖多少个按钮)。

    3.选中其中一个“自定义按钮”,仿照第2个秘技的第1点对它们进行命名。

    4.右击某个命名后的按钮,在随后弹出的快捷菜单中,选“指定宏”选项,打开“指定宏”对话框,选中相应的宏(如fuhao1等),确定退出。

    重复此步操作,将按钮与相应的宏链接起来。

    5.关闭“自定义”对话框,以后可以像使用普通工具栏一样,使用“专业符号”工具栏,向单元格中快速输入专业符号了。

    五、用“视面管理器”保存多个打印页面

    有的工作表,经常需要打印其中不同的区域,用“视面管理器”吧。

    1.打开需要打印的工作表,用鼠标在不需要打印的行(或列)标上拖拉,选中它们再右击鼠标,在随后出现的快捷菜单中,选“隐藏”选项,将不需要打印的行(或列)隐藏起来。

    2.执行“视图→视面管理器”命令,打开“视面管理器”对话框,单击“添加”按钮,弹出“添加视面”对话框,输入一个名称(如“上报表”)后,单击“确定”按钮。

    3.将隐藏的行(或列)显示出来,并重复上述操作,“添加”好其它的打印视面。

    4.以后需要打印某种表格时,打开“视面管理器”,选中需要打印的表格名称,单击“显示”按钮,工作表即刻按事先设定好的界面显示出来,简单设置、排版一下,按下工具栏上的“打印”按钮,一切就OK了。

    六、让数据按需排序

    如果你要将员工按其所在的部门进行排序,这些部门名称既的有关信息不是按拼音顺序,也不是按笔画顺序,怎么办?可采用自定义序列来排序。

    1.执行“格式→选项”命令,打开“选项”对话框,进入“自定义序列”标签中,在“输入序列”下面的方框中输入部门排序的序列(如“机关,车队,一车间,二车间,三车间”等),单击“添加”和“确定”按钮退出。

    2.选中“部门”列中任意一个单元格,执行“数据→排序”命令,打开“排序”对话框,单击“选项”按钮,弹出“排序选项”对话框,按其中的下拉按钮,选中刚才自定义的序列,按两次“确定”按钮返回,所有数据就按要求进行了排序。

    七、把数据彻底隐藏起来

    工作表部分单元格中的内容不想让浏览者查阅,只好将它隐藏起来了。

    1.选中需要隐藏内容的单元格(区域),执行“格式→单元格”命令,打开“单元格格式”对话框,在“数字”标签的“分类”下面选中“自定义”选项,然后在右边“类型”下面的方框中输入“;;;”(三个英文状态下的分号)。

    2.再切换到“保护”标签下,选中其中的“隐藏”选项,按“确定”按钮退出。

    3.执行“工具→保护→保护工作表”命令,打开“保护工作表”对话框,设置好密码后,“确定”返回。

    经过这样的设置以后,上述单元格中的内容不再显示出来,就是使用Excel的透明功能也不能让其现形。

    提示:在“保护”标签下,请不要清除“锁定”前面复选框中的“∨”号,这样可以防止别人删除你隐藏起来的数据。

    八、让中、英文输入法智能化地出现

    在编辑表格时,有的单元格中要输入英文,有的单元格中要输入中文,反复切换输入法实在不方便,何不设置一下,让输入法智能化地调整呢?

    选中需要输入中文的单元格区域,执行“数据→有效性”命令,打开“数据有效性”对话框,切换到“输入法模式”标签下,按“模式”右侧的下拉按钮,选中“打开”选项后,“确定”退出。

    以后当选中需要输入中文的单元格区域中任意一个单元格时,中文输入法(输入法列表中的第1个中文输入法)自动打开,当选中其它单元格时,中文输入法自动关闭。

    九、让“自动更正”输入统一的文本

    你是不是经常为输入某些固定的文本,如《电脑报》而烦恼呢?那就往下看吧。

    1.执行“工具→自动更正”命令,打开“自动更正”对话框。

    2.在“替换”下面的方框中输入“pcw”(也可以是其他字符,“pcw”用小写),在“替换为”下面的方框中输入“《电脑报》”,再单击“添加”和“确定”按钮。

    3.以后如果需要输入上述文本时,只要输入“pcw”字符此时可以不考虑“pcw”的大小写,然后确认一下就成了。

    十、在Excel中自定义函数

    Excel函数虽然丰富,但并不能满足我们的所有需要。我们可以自定义一个函数,来完成一些特定的运算。下面,我们就来自定义一个计算梯形面积的函数:

    1.执行“工具→宏→Visual Basic编辑器”菜单命令(或按“Alt+F11”快捷键),打开Visual Basic编辑窗口。

    2.在窗口中,执行“插入→模块”菜单命令,插入一个新的模块——模块1。

    3.在右边的“代码窗口”中输入以下代码:

    Function V(a,b,h)

    V = h*(a+b)/2

    End Function

    4.关闭窗口,自定义函数完成。

    以后可以像使用内置函数一样使用自定义函数。

    提示:用上面方法自定义的函数通常只能在相应的工作簿中使用。

    十一、表头下面衬张图片

    为工作表添加的背景,是衬在整个工作表下面的,能不能只衬在表头下面呢?

    1.执行“格式→工作表→背景”命令,打开“工作表背景”对话框,选中需要作为背景的图片后,按下“插入”按钮,将图片衬于整个工作表下面。

    2.在按住Ctrl键的同时,用鼠标在不需要衬图片的单元格(区域)中拖拉,同时选中这些单元格(区域)。 3.按“格式”工具栏上的“填充颜色”右侧的下拉按钮,在随后出现的“调色板”中,选中“白色”。

    经过这样的设置以后,留下的单元格下面衬上了图片,而上述选中的单元格(区域)下面就没有衬图片了(其实,是图片被“白色”遮盖了)。

    提示衬在单元格下面的图片是不支持打印的。

    十二、用连字符“&”来合并文本

    如果我们想将多列的内容合并到一列中,不需要利用函数,一个小小的连字符“&”就能将它搞定(此处假定将B、C、D列合并到一列中)。

    1.在D列后面插入两个空列(E、F列),然后在D1单元格中输入公式:=B1&C1&D1。

    2.再次选中D1单元格,用“填充柄”将上述公式复制到D列下面的单元格中,B、C、D列的内容即被合并到E列对应的单元格中。

    3.选中E列,执行“复制”操作,然后选中F列,执行“编辑→选择性粘贴”命令,打开“选择性粘贴”对话框,选中其中的“数值”选项,按下“确定”按钮,E列的内容(不是公式)即被复制到F列中。

    4.将B、C、D、E列删除,完成合并工作。

    提示:完成第1、2步的操作,合并效果已经实现,但此时如果删除B、C、D列,公式会出现错误。故须进行第3步操作,将公式转换为不变的“值”。

    十三、快速打印学生成绩条

    常有朋友问“如何打印成绩条”这样的问题,有不少人采取录制宏或VBA的方法来实现,这对于初学者来说有一定难度。出于此种考虑,我在这里给出一种用函数实现的简便方法。

    此处假定学生成绩保存在Sheet1工作表的A1至G64单元格区域中,其中第1行为标题,第2行为学科名称。

    1.切换到Sheet2工作表中,选中A1单元格,输入公式:=IF(MOD(ROW(),3)=0,〃〃,IF(0MODROW(),3(=1,sheet1!A$2,INDEX(sheet1!$A:$G,INT(((ROW()+4)/3)+1),COLUMN())))。 2.再次选中A1单元格,用“填充柄”将上述公式复制到B1至G1单元格中;然后,再同时选中A1至G1单元格区域,用“填充柄”将上述公式复制到A2至G185单元格中。

    至此,成绩条基本成型,下面简单修饰一下。

    3.调整好行高和列宽后,同时选中A1至G2单元格区域(第1位学生的成绩条区域),按“格式”工具栏“边框”右侧的下拉按钮,在随后出现的边框列表中,选中“所有框线”选项,为选中的区域添加边框(如果不需要边框,可以不进行此步及下面的操作)。

    4.同时选中A1至G3单元格区域,点击“常用”工具栏上的“格式刷”按钮,然后按住鼠标左键,自A4拖拉至G186单元格区域,为所有的成绩条添加边框。

    按“打印”按钮,即可将成绩条打印出来。

    十四、Excel帮你选函数

    在用函数处理数据时,常常不知道使用什么函数比较合适。Excel的“搜索函数”功能可以帮你缩小范围,挑选出合适的函数。

    执行“插入→函数”命令,打开“插入函数”对话框,在“搜索函数”下面的方框中输入要求(如“计数”),然后单击“转到”按钮,系统即刻将与“计数”有关的函数挑选出来,并显示在“选择函数”下面的列表框中。再结合查看相关的帮助文件,即可快速确定所需要的函数。

    十五、同时查看不同工作表中多个单元格内的数据

    有时,我们编辑某个工作表(Sheet1)时,需要查看其它工作表中(Sheet2、Sheet3……)某个单元格的内容,可以利用Excel的“监视窗口”功能来实现。

    执行“视图→工具栏→监视窗口”命令,打开“监视窗口”,单击其中的“添加监视”按钮,展开“添加监视点”对话框,用鼠标选中需要查看的单元格后,再单击“添加”按钮。重复前述操作,添加其它“监视点”。

    以后,无论在哪个工作表中,只要打开“监视窗口”,即可查看所有被监视点单元格内的数据和相关信息。

    十六、为单元格快速画边框

    在Excel 2002以前的版本中,为单元格区域添加边框的操作比较麻烦,Excel 2002对此功能进行了全新的拓展。

    单击“格式”工具栏上“边框”右侧的下拉按钮,在随后弹出的下拉列表中,选“绘图边框”选项,或者执行“视图→工具栏→边框”命令,展开“边框”工具栏。

    单击工具栏最左侧的下拉按钮,选中一种边框样式,然后在需要添加边框的单元格区域中拖拉,即可为相应的单元格区域快速画上边框。

    提示:①如果画错了边框,没关系,选中工具栏上的“擦除边框”按钮,然后在错误的边框上拖拉一下,就可以清除掉错误的边框。②如果需要画出不同颜色的边框,可以先按工具栏右侧的“线条颜色”按钮,在随后弹出的调色板中选中需要的颜色后,再画边框即可。③这一功能还可以在单元格中画上对角的斜线。

    十七、控制特定单元格输入文本的长度

    你能想象当你在该输入四位数的单元格中却填入了一个两位数,或者在该输入文字的单元格中你却输入了数字的时候,Excel就能自动判断、即时分析并弹出警告,那该多好啊!要实现这一功能,对Excel来说,也并不难。

    例如我们将光标定位到一个登记“年份”的单元格中,为了输入的统一和计算的方便,我们希望“年份”都用一个四位数来表示。所以,我们可以单击“数据”菜单的“有效性”选项。在“设置”卡片“有效性条件”的“允许”下拉菜单中选择“文本长度”。然后在“数据”下拉菜单中选择“等于”,且“长度”为“4”。同时,我们再来到“出错警告”卡片中,将“输入无效数据时显示的出错警告”设为“停止”,并在“标题”和“错误信息”栏中分别填入“输入文本非法!”和“请输入四位数年份。”字样。

    很显然,当如果有人在该单元格中输入的不是一个四位数时,Excel就会弹出示的警告对话框,告诉你出错原因,并直到你输入了正确“样式”的数值后方可继续录入。神奇吧?其实,在Excel的“数据有效性”判断中,还有许多特殊类型的数据格式可选,比如“文本类型”啊,“序列大小”啊,“时间远近”啊,如你有兴趣,何不自作主张,自己设计一种检测标准,让你的Excel展示出与众不同的光彩呢。

    十八、成组填充多张表格的固定单元格

    我们知道每次打开Excel,软件总是默认打开多张工作表。由此就可看出Excel除了拥有强大的单张表格的处理能力,更适合在多张相互关联的表格中协调工作。要协调关联,当然首先就需要同步输入。因此,在很多情况下,都会需要同时在多张表格的相同单元格中输入同样的内容。

    那么如何对表格进行成组编辑呢?首先我们单击第一个工作表的标签名“Sheet1”,然后按住Shift键,单击最后一张表格的标签名“Sheet3”(如果我们想关联的表格不在一起,可以按住Ctrl键进行点选)。此时,我们看到Excel的标题栏上的名称出现了“工作组”字样,我们就可以进行对工作组的编辑工作了。在需要一次输入多张表格内容的单元格中随便写点什么,我们发现,“工作组”中所有表格的同一位置都显示出相应内容了。

    但是,仅仅同步输入是远远不够的。比如,我们需要将多张表格中相同位置的数据统一改变格式该怎么办呢?首先,我们得改变第一张表格的数据格式,再单击“编辑”菜单的“填充”选项,然后在其子菜单中选择“至同组工作表”。这时,Excel会弹出“填充成组工作表”的对话框,在这里我们选择“格式”一项,点“确定”后,同组中所有表格该位置的数据格式都改变了。

    十九、改变文本的大小写

    在Excel中,为表格处理和数据运算提供最强大支持的不是公式,也不是数据库,而是函数。不要以为Excel中的函数只是针对数字,其实只要是写进表格中的内容,Excel都有对它编辑的特殊函数。例如改变文本的大小写。

    在Excel 2002中,至少提供了三种有关文本大小写转换的函数。它们分别是:“=UPPER(源数据格)”,将文本全部转换为大写;“=LOWER(源数据格)”,将文本全部转换成小写;“=PROPER(源数据格)”,将文本转换成“适当”的大小写,如让每个单词的首字母为大写等。例如,我们在一张表格的A1单元格中输入小写的“excel”,然后在目标单元格中输入“=UPPER(A1)”,回车后得到的结果将会是“EXCEL”。同样,如果我们在A3单元格中输入“mr.weiwei”,然后我们在目标单元格中输入“=PROPER(A3)”,那么我们得到的结果就将是“Mr.Weiwei”了。

    二十、提取字符串中的特定字符

    除了直接输入外,从已存在的单元格内容中提取特定字符输入,绝对是一种省时又省事的方法,特别是对一些样式雷同的信息更是如此,比如员工名单、籍贯等信息。

    如果我们想快速从A4单元格中提取称谓的话,最好使用“=RIGHT(源数据格,提取的字符数)”函数,它表示“从A4单元格最右侧的字符开始提取2个字符”输入到此位置。当然,如果你想提取姓名的话,则要使用“=LEFT(源数据格,提取的字符数)”函数了。还有一种情况,我们不从左右两端开始,而是直接从数据中间提取几个字符。比如我们要想从A5单元格中提取“武汉”两个字时,就只须在目标单元格中输入“=MID(A5,4,2)”就可以了。意思是:在A5单元格中提取第4个字符后的两个字符,也就是第4和第5两个字。

    二十一、把基数词转换成序数词

    将英文的基数词转换成序数词是一个比较复杂的问题。因为它没有一个十分固定的模式:大多数的数字在变成序数词都是使用的“th”后缀,但大凡是以“1”、“2”、“3”结尾的数字却分别是以“st”、“nd”和“rd”结尾的。而且,“11”、“12”、“13”这3个数字又不一样,它们却仍然是以“th”结尾的。因此,实现起来似乎很复杂。其实,只要我们理清思路,找准函数,只须编写一个公式,就可轻松转换了。不信,请看:“=A2&IF(OR(value(RIGHT(A2,2))=),〃th〃,IF(OR(value(RIGHT(A2))=,CHOOSE(RIGHT(A2),〃st〃,〃nd〃,〃rd〃),〃th〃))”。该公式尽管一长串,不过含义却很明确:①如果数字是以“11”、“12”、“13”结尾的,则加上“th”后缀;②如果第1原则无效,则检查最后一个数字,以“1”结尾使用“st”、以“2”结尾使用“nd”、以“3”结尾使用“rd”;③如果第1、2原则都无效,那么就用“th”。因此,基数词和序数词的转换实现得如此轻松和快捷。

    二十二、用特殊符号补齐位数

    和财务打过交道的人都知道,在账面填充时有一种约定俗成的“安全填写法”,那就是将金额中的空位补齐,或者在款项数据的前面加上“$”之类的符号。其实,在Excel中也有类似的输入方法,那就是“REPT”函数。它的基本格式是“=REPT(“特殊符号”,填充位数)”。

    比如,我们要在中A2单元格里的数字结尾处用“#”号填充至16位,就只须将公式改为“=(A2&REPT(〃#〃,16-LEN(A2)))”即可;如果我们要将A3单元格中的数字从左侧用“#”号填充至16位,就要改为“=REPT(〃#〃,16-LEN(A3)))&A3”;另外,如果我们想用“#”号将A4中的数值从两侧填充,则需要改为“=REPT(〃#〃,8-LEN(A4)/2)&A4&REPT(〃#〃)8-LEN(A4)/2)”;如果你还嫌不够专业,要在A5单元格数字的顶头加上“$”符号的话,那就改为:“=(TEXT(A5,〃$#,##0.00〃(&REPT(〃#〃,16-LEN(TEXT(A5,〃$#,##0.00〃))))”,一定能满足你的要求。

    二十三、创建文本直方图

    除了重复输入之外,“REPT”函数另一项衍生应用就是可以直接在工作表中创建由纯文本组成的直方图。它的原理也很简单,就是利用特殊符号的智能重复,按照指定单元格中的计算结果表现出长短不一的比较效果。

    比如我们首先制作一张年度收支平衡表,然后将“E列”作为直方图中“预算内”月份的显示区,将“G列”则作为直方图中“超预算”的显示区。然后根据表中已有结果“D列”的数值,用“Wingdings”字体的“N”字符表现出来。具体步骤如下:

    在E3单元格中写入公式“=IF(D3<0,REPT(〃n〃,-ROUND(D3*100,0)),〃〃)”,然后选中它并拖动“填充柄”,使E列中所有行都能一一对应D列中的结果;接着在G3单元格中写入公式“=IF(D3>0,REPT(〃n〃,ROUND(D3*100,0)),〃〃)”,也拖动填充柄至G14。我们看到,一个没有动用Excel图表功能的纯文本直方图已展现眼前,方便直观,简单明了。

    二十四、计算单元格中的总字数

    有时候,我们可能对某个单元格中字符的数量感兴趣,需要计算单元格中的总字数。要解决这个问题,除了利用到“SUBSTITUTE”函数的虚拟计算外,还要动用“TRIM”函数来删除空格。比如现在A1单元格中输入有“how many words?”字样,那么我们就可以用如下的表达式来帮忙:

    “=IF(LEN(A1)=0,0,LEN(TRIM(A1))-LEN(SUBSTITUTE(TRIM(A1),〃,〃,〃〃))+1)”

    该式的含义是先用“SUBSTITUTE”函数创建一个新字符串,并且利用“TRIM”函数删除其中字符间的空格,然后计算此字符串和原字符串的数位差,从而得出“空格”的数量,最后将空格数+1,就得出单元格中字符的数量了。

    二十五、关于欧元的转换

    这是Excel 2002中的新工具。如果你在安装Excel 2002时选择的是默认方式,那么很可能不能在“工具”菜单中找到它。不过,我们可以先选择“工具”菜单中的“加载宏”,然后在弹出窗口中勾选“欧元工具”选项,“确定”后Excel 2002就会自行安装了。

    完成后我们再次打开“工具”菜单,单击“欧元转换”,一个独立的专门用于欧元和欧盟成员国货币转换的窗口就出现了。与Excel的其他函数窗口一样,我们可以通过鼠标设置货币转换的“源区域”和“目标区域”,然后再选择转换前后的不同币种即可。所示的就是“100欧元”分别转换成欧盟成员国其他货币的比价一览表。当然,为了使欧元的显示更显专业,我们还可以点击Excel工具栏上的“欧元”按钮,这样所有转换后的货币数值都是欧元的样式了。

    二十六、给表格做个超级搜索引擎

    我们知道,Excel表格和Word中的表格最大的不同就是Excel是将填入表格中的所有内容(包括静态文本)都纳入了数据库的范畴之内。我们可以利用“函数查询”,对目标数据进行精确定位,就像网页中的搜索引擎一样。

    比如在所示的表格中,从A1到F7的单元格中输入了多名同学的各科成绩。而在A8到A13的单元格中我们则建立了一个“函数查询”区域。我们的设想是,当我们在“输入学生姓名”右边的单元格,也就是C8格中输入任何一个同学的名字后,其下方的单元格中就会自动显示出该学生的各科成绩。具体实现的方法如下:

    将光标定位到C9单元格中,然后单击“插入”之“函数”选项。在如图18弹出的窗口中,选择 “VLOOKUP” 函数,点“确定”。在随即弹出的“函数参数”窗口中我们设置“Lookup_value”(指需要在数据表首列中搜索的值)为“C8”(即搜索我们在C8单元格中填入的人名);“Table_array”(指数据搜索的范围)为“A2∶B6”(即在所有学生的“语文”成绩中搜索);“Col_vindex_num”(指要搜索的数值在表格中的序列号)为“2”(即数值在第2列);“Range_lookup”(指是否需要精确匹配)为“FALSE”(表明不是。如果是,就为“TURE”)。设定完毕按“确定”。

    取消

    评论

    展开全文
  • 大家都知道在word中控件的使用...比如当有多个相同的控件存在时,只要复制粘贴然后修改复选框内的文字即可。好了,话不多说,需要的朋友可以借此机会学习下,希望对大家有所帮助。 操作方法 ①首先输入问题,然...
  • Excel表格如何批量给多个单元格填充相同数据腾讯视频/爱奇艺/优酷/外卖 充值4折起我们在使用excel制作表格的时候经常会遇到给多个单元格批量添加相同数据或文字的情况,今天就跟大家介绍一下具体操作步骤。...
  • F4快捷键在EXCEL里面是什么功能F4键的作用有:1、可以循变单元格引用的类型:在引用(A1)--绝对引用($A$1)-混合引用(A$1,$A$1)之间切换2、重一此操作,如单元格设置后,按F4可以重复上一次的单元格设置;...
  • 如何保护Excel工作表

    万次阅读 2012-02-20 18:08:07
    保护工作薄是保护工作薄的窗口或者结构,举个例子,一个工作薄里面有3个工作表,你设置了工作薄保护,就只有在解除工作薄保护之后才可以增加或者删除工作表,但对已经存在的工作表,可以进行编辑的,也就是你说的...
  • 【Excel神技】之 工作表区域保护

    千次阅读 2018-02-05 18:37:57
    Excel加密大家应该不陌生,但有时自己的excel表格只有某些区域不希望被改动,要怎么办?...☞ 首先,Ctrl+A全选整个工作簿内容,然后按Ctrl+1(数字1),取消保护区域的【锁定】选项: ☞选中要保护
  • Activiti工作流6.0结构介绍

    千次阅读 2019-09-21 23:47:19
    Activiti工作流6.0结构介绍 数据库设计规则 分类 描述 说明 ACT_GE_* 通用数据(GE 代表 General) ACT_RE_* 流程定义...
  • 日常工作中经常遇到这样的问题:对于某个excel表格,我们已经写好公式了,发给...先说小知识点学会这之前,我们要知道一前提:Excel中所有单元格默认都是锁定的,只是我们没有加密工作表。为什么这么说呢?看...
  • 用VBA去除Excel工作表保护密码

    万次阅读 2012-02-21 14:31:19
    现象: 想要修改保护单元 格的内容,在使用“工具”菜单“保护”子菜单的“撤消工作表保护”命令,这时要求输入密码。 解决方案:网上找到一文http://www.excel123.cn/Article/excelvba/200812/126.html 1.按Alt+...
  • 本文介绍 MySQL 8.0 为锁定读取语句 SELECT ......查询立即执行,如果请求的行被锁定,返回一错误信息。 使用 SKIP LOCKED 选项的锁定读取不会等待获取行锁。查询立即执行,并且从结果中排除了被锁定的行。
  • activity工作结构分析

    万次阅读 2016-08-02 10:52:28
    Activiti使用到的都是ACT_开头的。 ACT_RE_*: ’RE’表示repository(存储),RepositoryService接口所操作的。带此前缀的包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。 ACT_RU_*: ‘RU’...
  • 锁定单元格不被任意修改和删除1、按 Ctrl + A 全选,选中整个表格,右键,在弹出的菜单中选择“设置单元格格式”,在打开的窗口中选择“保护”选项卡,单击“锁定”把其前的钩去掉,单击“确定”;2、选中要锁定...
  • 锁定单个或多个单元格与解锁方法

    千次阅读 2014-10-24 10:33:13
    在这模板中为了避免数据输入的重复或手工计算的工作量,有不少项是自动计算出来的。EXCEL是最普通最常用的数据处理软件,有很的企业报表模板就用它。模板中有很的计算公式,如果不对这些公式进行保护,在
  • 工作流系列(4.1)-Activity结构介绍

    千次阅读 2018-11-30 14:50:37
    文章目录Activiti结构介绍通用信息1)ACT_GE_BYTEARRAY 资源2)ACT_GE_PROPERTY 属性资源信息1)ACT_RE_DEPLOYMENT 部署信息2)ACT_RE_MODEL 模型信息2)ACT_RE_PRODEF 流程信息用户信息1)ACT_ID_GROUP 用户组...
  • activiti工作流数据库详细说明

    千次阅读 2018-12-05 14:31:48
    Activiti使用到的都是ACT_开头的。 ACT_RE_*: ’RE’表示repository(存储),RepositoryService接口所操作的。带此前缀的包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。 ACT_RU_*: ‘RU’...
  • 几天不研究学习Excel感觉心里总是空空的,所以今日在解答朋友如何快速定位到第一个工作表的快捷键的时候发现到了微软没有支持直接快捷键切换到第一个工作表,但是经过长时间的思索,我发明了长按Ctrl+Page的方法,受...
  • Zookeeper 工作原理(待查) Zookeeper 的核心是原子广播,这机制保证了各个 server 之间的同步。实现这机制的协议叫做 Zab 协议。Zab 协议有两种模式,它们分别是恢复模式和广播模式。 zoo与eur区别 zookeeper...
  • 链表基础知识总结

    万次阅读 多人点赞 2018-05-02 19:47:49
    链表和数组作为算法中的两基本数据结构,在程序设计过程中经常用到。尽管两种结构都可以用来存储一系列的数据,但又各有各的特点。数组的优势,在于可以方便的遍历查找需要的数据。在查询数组指定位置(如查询数组...
  • Activiti工作结构详解

    千次阅读 2017-02-09 09:13:51
    1 Activiti数据库结构 ...并且表名的第二部分用两字母表明的用例,而这用例也基本上跟Service API匹配。 u ACT_GE_* : “GE”代表“General”(通用),用在各种情况下; u ACT_HI_* : “HI”代
  • 说明:笔者想制作一类似分数查询网站一样,通过输入自己独一无二的“编号代码”,系统会自动生成对应的数据。奈何编程水平不够,Python也是刚学不久,听说查找数据检索数据很快,matlab也是,但是也要做一可视化...
  • EXCEL工作表保护密码破解方式

    千次阅读 2015-01-23 08:50:04
    若要修改受保护单元格或图表,请先使用‘撤消工作表保护’命令(在‘审阅’选项卡的‘更改’组中)来取消保护。可能会提示您输入密码。  出现这种情况,应该怎么解决呢?经过研究,找到了两种破解Excel工作表保护...
  • Mysql多表查询效率的研究(一)

    万次阅读 2017-08-18 21:44:10
    Mysql多表查询效率的研究(一)本文探究了mysql InnoDB引擎在多表查询的应用场景下,使用子、内连接和左联接运行速度的差别,并且比较了索引使用与否对查询效率的影响。 第一部分简略地概括了索引、子查询、...
  • (3)Lock能提高多个线程读操作的效率; (4)Lock:Lock实现和synchronized不一样,后者是一种悲观锁,它胆子很小,它很怕有人和它抢吃的,所以它每次吃东西前都把自己关起来。而Lock底层其实是CAS乐观锁的体现,...
  • 作成结构相同的sheet的Excel文件,其中根据业务要求,sheet中分为两块,一块是固定部分要求锁定, 不能做修改、插入及删除行列的操作,另一部分是动态部分,只允许删除列。本来以为不难实现,然而在做到动态部分...
  • MySQL优化系列15-优化Innodb

    千次阅读 2021-07-19 14:04:51
    备注:测试数据库版本为MySQL 8.0 文章目录一. 优化InnoDB的存储布局二.优化InnoDB事务管理三....一旦您的数据达到稳定的大小,或者一不断增长的增加了几十或几百兆字节,请考虑使用OPTIMIZE tabl
  • 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外。MySQL数据库由于其...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 132,447
精华内容 52,978
关键字:

怎么锁定多个工作表