Tag: 范围

如何通过COM Interop在Excel中获取特定范围?

我有以下问题。 我必须通过COM互操作来读取一个excel文件。 我是使用COM interop编程的新手。 我用这个search一个特定的string: this.sheet = (Excel.Worksheet)this.excelApp.Workbook.Sheets.Item[this.sheetname]; this.sheet.Activate(); Excel.Range firstRow = this.sheet.Range["A1", "XFD1"]; Excel.Range foundRange = firstRow.Find( this.StringISearch, Type.Missing, Type.Missing, Excel.XlLookAt.xlWhole, Excel.XlSearchOrder.xlByColumns, Excel.XlSearchDirection.xlNext, false, false, Type.Missing); 不,我想用foundRange作为起点来获得另一个范围。 像这样的东西 Excel.Range MyRange = this.sheet.Range[foundRange + 2 rows, + 1 column & lastRow]; 我没有办法做到这一点。 有一个吗?

VBA粘贴范围

我有简单的目标复制范围和粘贴到另一个spreadsheet 。 下面的code给出了副本,但不粘贴。 Sub Normalize() Dim Ticker As Range Sheets("Sheet1").Activate Set Ticker = Range(Cells(2, 1), Cells(65, 1)) Ticker.Copy Sheets("Sheet2").Select Cells(1, 1).Activate Ticker.PasteSpecial xlPasteAll End Sub 有什么build议么?

Excel中的命名范围OpenXML

我正在尝试使用OpenXML在Excel中创build命名范围。 我可以在DefinedNames集合中添加一个DefinedName,但是这似乎没有任何作用。 我注意到ExtendedFileProperties中的一个地方,名称范围正在保存,一个称为“TitlesOfParts”的结构。 我已经尝试在那里添加一个条目,但是这会导致excel抛出一个错误,并且不会创build指定的范围。 这是我正在使用的代码: public void AddNamedRange(string pNamedRangeRef, string pNamedRangeName) { DefinedName _definedName = new DefinedName() { Name = pNamedRangeName, Text = pNamedRangeRef }; _workbook.Descendants<DocumentFormat.OpenXml.Spreadsheet.DefinedNames>().First().Append(_definedName); DocumentFormat.OpenXml.VariantTypes.VTLPSTR _t = new DocumentFormat.OpenXml.VariantTypes.VTLPSTR() { Text = pNamedRangeName }; _spreadsheet.ExtendedFilePropertiesPart.Properties.TitlesOfParts.VTVector.Append(_t); _spreadsheet.ExtendedFilePropertiesPart.Properties.TitlesOfParts.VTVector.Size++; }

C#:Microsoft.Office.Interop.Excel.Range的ID字段不保存与Excel表单

在我开始解决问题之前,我想激励它。 我的任务是分析Excel表单中的更改,但是与通过内部机制logging更改不同,应该以编程方式检测更改,即使用户已停用logging更改或者我的Excel-AddIn未安装。 为此,我使用Microsoft.Interop.Excel-Library访问工作表和单元格。 现在到了这个问题:即使用户已经sorting或者移动了数据,为了find更改,我希望每个单元格都有一个唯一的ID,即使移动或复制也是如此。 当然,如果复制,ID在表单中是两次,新添加的单元格没有ID,但没关系。 进一步来说,这个ID不应该对用户可见,并且用户不应该能够修改或删除它。 所以我查找了一个字段,发现Range-Object可以代表一个单元格,并且有不同的成员可以访问。 一个专业领域引起了我的注意,ID字段,看起来像我正在寻找。 Guid guid = Guid.NewGuid(); ((Range) worksheet.Cells[rowNr, columnNr]).ID = guid.ToString(); 也可以这样读 Guid guid = Guid.Parse(((Range) worksheet.Cells[rowNr, columnNr]).ID); 这是完美的,因为我能够存储一个string(在这种情况下,一个Guid作为string,如123463-fc34-c43a-a391-399fc2)并读取它。 它也粘在细胞上,被移动,当细胞被移动等。 但不幸的是,这个ID字段没有被保存,当文件被保存时,我不知道为什么。 我的意思是closures并重新打开工作簿后,所有的ID都不见了。 所以我的问题是,如果有任何其他成员的范围对象,可以容纳一个string(= GUID),哪些是不可见的用户。 我尝试了名称成员和评论成员,但它们都是用户可见的,并且可以很容易地修改。 或者,有没有办法告诉Excel,我也想保存ID字段时,保存工作表? 对于testing,您可以创build一个项目,添加对Microsoft.Office.Interop.Excel-Dll的引用并添加以下代码(您必须在系统上安装Excel)。 这是一个unit testing,与JUnit一起运行,但只需删除Assert-Command即可在没有JUnit的情况下进行testing: using System; using System.IO; using Microsoft.Office.Interop.Excel; using Excel = Microsoft.Office.Interop.Excel; public void AddGuidAndRead() { Excel.Application excelApp = new Excel.Application(); Workbook […]

使用VBA在Excel中循环显示表格的第一列

这应该是相当简单的,但我有点卡住了。 我在工作表中有一个名为“ClientReturns”的表。 该表的第一列包含客户的账号。 我想每次循环获取帐号。 这是我迄今为止,但它也通过其他列中的数据,当我只想在第一列的数据。 Sub doStuff() Set ClientTable = Sheets("Returns").range("ClientReturns") For Each tRow In ClientTable AccNum = tRow.Columns(1).Value 'Do stuff with the account num Next AccNum End Sub 非常感谢答案…我解决了这个问题: Sub getReturns() Dim lookR As range, c As range With Sheets("Returns").ListObjects("ClientReturns") Set lookR = .ListColumns("Account Number").DataBodyRange For Each AccNum In lookR.Cells 'Let's see if it's […]

在VBA中使用一个范围数组 – Excel

VBA是否支持使用范围variables数组? dim rangeArray() as range dim count as integer dim i as integer count = 3 redim rangeArray(1 to count) for i = 1 to count msgbox rangeArray(i).cells(1,1).value next 我不能让它在这种types的应用程序中工作。 我想按一定顺序存储一系列的范围作为“主副本”。 然后,我可以添加,删除,sorting或做任何事情,这个数组,然后打印出来的Excel中的一系列范围。 它似乎不像Excel支持这一点 – 它只是迫使你存储在电子表格中的数据,你必须重读它才能使用它。

testingVBA中是否存在范围

我在我的Excel中有一个dynamic定义的命名范围,从表中抓取基于开始date和结束date的数据 =OFFSET(Time!$A$1,IFERROR(MATCH(Date_Range_Start,AllDates,0)-1,MATCH(Date_Range_Start,AllDates)),1,MATCH(Date_Range_End,AllDates)-IFERROR(MATCH(Date_Range_Start,AllDates,0)-1,MATCH(Date_Range_Start,AllDates)),4) 但是,如果date范围在表格中没有数据,则范围不存在(或某物,idk)。 如何在VBA中编写代码来testing这个范围是否存在? 我试过类似的东西 If Not Range("DateRangeData") Is Nothing Then 但我得到“运行时错误1004,对象'_Global'的方法'范围'失败。

将整个范围转换为大写,而不循环遍历所有单元格

现在我正在使用下面的代码将小写字母列表从小写字母转换为大写字母: Dim Tickers As String Dim n As Integer For n = 2 To Last Tickers = UCase(W.Cells(n, 1).Value) W.Cells(n, 1).Value = Tickers Next n 有没有一种方法可以将整个范围转换成一行? 就像是: Range("A1:A20").convertouppercasesomehow

在VBA中减去范围(Excel)

我正在尝试做什么 我试图写一个函数来减去Excel范围 。 它应该有两个input参数:范围A和范围B.它应该返回范围对象,它是属于范围A的一部分的单元格,不属于范围B的一部分(如在设置减法中 ) 我试过了 我在网上看到了一些使用临时工作表来做这件事的例子(很快,但是可能会引入一些受保护的工作簿等问题) ,还有一些其他的例子,通过第一个范围检查与第二个一个(非常慢) 。 经过一番思考,我已经提出了这个代码{1} ,它运行得更快,但仍然很慢。 从代表整个工作表的范围中减去1到5分钟取决于第二范围的复杂程度。 当我查看那些试图加快速度的代码时,我发现应用分治策略的可能性是我所做的{2} 。 但是这使我的代码变慢了。 我不是一个CS的家伙,所以我可能做错了什么,或者这个algorithm根本就不是分治应该使用的那个,我不知道。 我也尝试使用大多数recursion重写它,但是这花了很长时间来完成或(更经常地)抛出堆栈空间错误。 我没有保存代码。 我已经能够做的唯一(略微)成功的改进是添加一个翻转开关{3} ,首先通过行,然后(在下一个调用中)通过列,而不是通过两个在同一个调用,但效果没有我所希望的那么好。 现在我看到,即使在第一次调用中没有经过所有行,但在第二次调用中,我们仍然会循环执行与第一次调用相同数量的行,但只有这些行稍微短一点:) 我将不胜感激任何帮助改善或重写这个function,谢谢! 该解决scheme基于Dick Kusleika接受的答案 迪克Kusleika ,非常感谢您提供您的答案! 我想我会用它做一些修改: 摆脱了全局variables(mrBuild) 修正了“一些重叠”的情况,排除了“不重叠”的情况 增加了更复杂的条件来select是从上到下还是从左到右分割范围 通过这些修改,代码在大多数常见情况下运行速度非常快。 正如已经指出的那样,我同意的棋盘式的巨大的范围仍然是缓慢的,是不可避免的。 我认为这个代码还有一个改进的余地,我会更新这个post,以防我修改它。 改进可能性: select如何分割范围的启发式(按列或按行) {0}解决scheme代码 Public Function SubtractRanges(rFirst As Range, rSecond As Range) As Range ' ' Returns a range of cells that are […]

VBA对话框在不同的工作簿中select范围

我想让用户select一个可能在不同工作簿中的范围。 我试图用inputbox(“”,type:= 8)来做到这一点,它可以在工作簿中select数据,但拒绝让我在不同的工作簿中select一个范围。 因此,我想要一个对话框,允许我执行这个任务。