SharePoint 2013 报错 异常来自 HRESULT:0X80131904

本文介绍了当遇到 SharePoint 配置数据库日志文件过大导致无法正常上传文件或新建文件夹的问题时,通过调整数据库恢复模式并压缩日志文件来解决的方法。

直接上传文件,报错:该Url xxxx无效。它可能指向不存在的文件或文件夹,或者是执行不再当前网站中的有效文件或文件夹。

直接新建文件夹,报错:异常来自 HRESULT:0X80131904

以系统账号身份操作,所以权限不是问题,问题真正原因:日志文件过大。(实际日志已经超过1.9T)

 

解决方法:收缩日志。

USE SharePoint_Config;

GO

-- 将数据库设置为简单恢复模式,

ALTER DATABASE SharePoint_Config

SET RECOVERY SIMPLE;

GO

--压缩为100M

DBCC SHRINKFILE (SharePoint_Config_log, 100);

GO

-- 恢复

ALTER DATABASE SharePoint_Config

SET RECOVERY FULL;

GO

<think> 根据提供的错误信息 `Exception from HRESULT: 0x800AC472`,这是在使用Excel VBA操作Excel对象时常见的错误。这个错误代码对应的是 **“无法插入工作表,因为工作簿中已包含最大数量的工作表”**。在早期的Excel版本(如Excel 2003)中,每个工作簿最多只能有255个工作表,而在较新的版本(Excel 2007及以上)中,这个限制被提高到了受可用内存限制,但实际最大值仍受系统资源限制。然而,即使在新版本中,如果尝试添加的工作表数量超过限制,也会出现此错误。 ### 问题原因 1. **超出工作表数量限制**:在代码中,通过多次复制工作表(使用`oSheet1.Copy`)添加到工作簿,可能导致工作表总数超过Excel允许的最大数量。 2. **资源限制**:即使没有达到理论最大数量,由于系统资源不足(如内存不足),也可能导致无法添加新工作表。 ### 解决方案 1. **检查当前工作表数量**:在添加新工作表前,检查工作簿中现有的工作表数量是否接近限制。 2. **清理不需要的工作表**:如果可能,删除一些不需要的工作表。 3. **合并操作**:考虑是否可以通过其他方式(如在一个工作表中放置多个数据集)来避免过多的工作表。 4. **使用新工作簿**:将新增的工作表放到新的工作簿中。 ### 修改代码示例 在每次复制工作表之前,先检查工作簿中的工作表数量。如果接近限制(例如设定一个阈值,如250),则创建一个新的工作簿。 ```vbscript ' 定义常量:工作表数量阈值(根据Excel版本调整) Const MAX_SHEETS As Integer = 250 ' ... 其他代码 ... If grrpath <> "" Then booknum = booknum + 1 oBooks.Open(Server.MapPath("~") + grrpath) oSheet1 = oBooks.Item(booknum).Worksheets(1) ' 检查目标工作簿(oBooks.Item(1))中的工作表数量 If oBooks.Item(1).Sheets.Count >= MAX_SHEETS Then ' 创建新的工作簿 Dim newWorkbook As Workbook Set newWorkbook = oExcel.Workbooks.Add ' 将新工作簿添加到oBooks集合?根据实际情况调整 ' 这里假设需要将工作表复制到新工作簿 oSheet1.Copy Before:=newWorkbook.Sheets(1) newWorkbook.Sheets(1).Name = "GRR" ' ... 其他操作 ... Else ' 复制到原工作簿 oSheet1.Copy Before:=oBooks.Item(1).Sheets(oBooks.Item(1).Sheets.Count) oBooks.Item(1).Sheets(oBooks.Item(1).Sheets.Count).Name = "GRR" End If ' ... 保护等操作 ... End If ``` ### 详细解释 1. **设定阈值**:我们设定一个阈值(如250),以避免达到最大限制。这个值可以根据实际情况调整(例如,如果知道用户使用的是Excel 2003,则阈值设为255)。 2. **创建新工作簿**:当检测到当前工作簿的工作表数量达到阈值时,创建一个新的工作簿,并将新工作表复制到新工作簿中。 3. **复制到新位置**:使用`Copy`方法时,指定目标工作簿和工作表位置。 ### 其他注意事项 - **错误处理**:添加错误处理机制,以便在无法创建新工作表时给出友好提示。 ```vbscript On Error Resume Next ' 尝试复制操作 If Err.Number <> 0 Then MsgBox "无法添加更多工作表,已达到系统限制。", vbExclamation Exit Sub End If On Error GoTo 0 ``` - **版本兼容性**:不同Excel版本的最大工作表数量不同,可以通过代码获取: ```vbscript Dim maxSheets As Long ' Excel 2003及之前版本:255,之后版本:受内存限制,但实际可用数量可能因内存和系统资源而异。 ' 无法直接获取最大值,但可以通过应用程序版本判断 If Val(oExcel.Version) < 12 Then ' Excel 2003及之前版本号为11.0及以下 maxSheets = 255 Else ' 对于新版本,设置一个较高的安全值,如1024 maxSheets = 1024 End If ``` ### 完整修复建议 在原始代码中,可能是在多次调用`oSheet1.Copy`后导致工作簿中工作表数量过多。因此,在每次复制前都应进行检查。 §§相关问题§§: 1. 如何通过VBA判断当前Excel版本? 2. 在VBA中如何高效地管理大量工作表? 3. 如何动态监控Excel工作簿中的工作表数量? 4. VBA中如何处理因资源不足导致的运行时错误? </think> ### 错误分析:`Exception from HRESULT: 0x800AC472` 这个错误代码 `0x800AC472` 是 Excel VBA 操作中常见的 COM 异常,表示 **"Excel 无法完成操作,内存或磁盘资源不足"**。通常在以下情况发生: 1. **资源耗尽**: - Excel 工作簿过于庞大(工作表过多/数据量太大) - 系统内存不足 - 打开了过多 Excel 实例 2. **操作冲突**: - 尝试操作未完全加载的工作簿 - 同时执行多个资源密集型操作 - 工作表保护状态下执行禁止操作 3. **特定操作触发**: - 大规模复制/移动工作表 - 操作大型数据范围 - 复杂的公式计算 ### 解决方案 以下是几种修复方法,按照优先级排序: #### 方法一:优化资源使用(推荐) ```vbscript ' 在操作前添加这些优化 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False On Error Resume Next ' 添加错误处理 ' --- 原始操作代码 --- oSheet1.Move After:=oBooks.Item(1).Sheets(oBooks.Item(1).Sheets.Count) ' -------------------- If Err.Number <> 0 Then MsgBox "操作失败: " & Err.Description, vbCritical End If ' 恢复设置 Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True ``` **优化说明**: 1. `ScreenUpdating=False`:禁用屏幕刷新,减少资源消耗 2. `Calculation=Manual`:暂停自动计算 3. `EnableEvents=False`:禁用事件触发 4. 错误处理确保操作失败时给出明确提示 #### 方法二:分步操作替代批量操作 ```vbscript ' 替代一次性移动所有工作表 For i = oBooks.Item(1).Sheets.Count To 1 Step -1 Dim targetSheet As Worksheet Set targetSheet = oBooks.Item(1).Sheets(i) If targetSheet.Name = "需要移动的工作表" Then targetSheet.Unprotect "m1s3a3" targetSheet.Move After:=oBooks.Item(1).Sheets(oBooks.Item(1).Sheets.Count) targetSheet.Protect "m1s3a3" Exit For End If Next i ``` #### 方法三:内存清理技术 ```vbscript ' 在关键操作前后添加内存清理 Sub CleanMemory() On Error Resume Next Set fso = CreateObject("Scripting.FileSystemObject") Set Drives = fso.Drives For Each Drive In Drives Drive.AvailableSpace Next Set fso = Nothing Set Drives = Nothing End Sub ' 使用方式 CleanMemory oSheet1.Move After:=... CleanMemory ``` ### 预防措施 1. **操作前检查资源状态**: ```vbscript Function CanPerformOperation() As Boolean Dim memStatus As MEMORYSTATUSEX memStatus.dwLength = Len(memStatus) GlobalMemoryStatusEx memStatus ' 确保至少100MB可用内存 If memStatus.ullAvailPhys < 100 * 1024 * 1024 Then MsgBox "内存不足,请关闭其他程序再试", vbExclamation CanPerformOperation = False Exit Function End If ' 检查磁盘空间 Dim freeSpace As Long freeSpace = GetDiskFreeSpaceEx(CurDir) If freeSpace < 500 * 1024 * 1024 Then ' 500MB MsgBox "磁盘空间不足,请清理空间", vbExclamation CanPerformOperation = False Exit Function End If CanPerformOperation = True End Function ``` 2. **使用延迟操作技术**: ```vbscript ' 分批处理大型操作 Sub SafeMoveSheets() Dim i As Long For i = 1 To Sheets.Count If i Mod 5 = 0 Then ' 每5个工作表暂停一次 DoEvents CleanMemory End If Sheets(i).Move After:=Sheets(Sheets.Count) Next i End Sub ``` ### 终极解决方案 如果以上方法均无效,考虑重构代码: ```vbscript ' 替代方案:使用工作簿复制而非工作表移动 Dim tempBook As Workbook Set tempBook = Workbooks.Add ' 将需要移动的工作表复制到临时工作簿 oSheet1.Copy Before:=tempBook.Sheets(1) ' 删除原工作表(可选) oBooks.Item(1).Sheets(oSheet1.Name).Delete ' 从临时工作簿移回目标位置 tempBook.Sheets(1).Move After:=oBooks.Item(1).Sheets(oBooks.Item(1).Sheets.Count) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值