Gustav Brock
Gustav at cactus.dk
Fri Aug 21 11:55:59 CDT 2009
Hi Susan Here's a small example including a useful RLookup function I have used to look up configuration data in a worksheet. It of course uses ranges. It was made in Excel 97 but should work in any newer version as well. <code> Function DLookupSystem(strFieldName As String) As Variant ' Look up a value in the System range in the data worksheet. Const cstrWorkbookData As String = "PeriodsData.xls" Const cstrWorkSheet As String = "System" Const cstrRange As String = "xlsSystem" Dim wkb As Workbook Dim wks As Worksheet Dim rng As Range Dim varTemp As Variant Set wkb = Workbooks(cstrWorkbookData) Set wks = wkb.Worksheets(cstrWorkSheet) Set rng = wks.Range(cstrRange) varTemp = RLookup(rng, strFieldName, xlByRows) If IsNull(varTemp) Then varTemp = 0 End If Set wkb = Nothing Set wks = Nothing Set rng = Nothing DLookupSystem = varTemp End Function Function RLookup(ByVal rngLookup As Range, _ ByVal strField As String, _ Optional intSearchOrder As Integer = xlByRows, _ Optional intOffset As Integer = 1) As Variant ' Looks up a value in the named range rngLookup from the cell, ' offset intOffset rows below or columns right from the found cell. ' ' 2000-07-30. ' Cactus Data ApS, Gustav Brock ' Default intSearchOrder is xlByRows, as named ranges built this way ' are easily attached by Access. Dim rng As Range Dim intRow As Integer Dim intColumn As Integer ' No special errorhandling. On Error Resume Next If intSearchOrder = xlByRows Then ' Search by rows. ' Read from found row, offset intOffset rows, and found column. Else ' Search by columns. ' Read from found row and found column, offset intOffset columns. intSearchOrder = xlByColumns End If With rngLookup ' Start search from upper left cell in range by starting in lower right cell. ' Search case sensitive for whole words in values only. Set rng = .Find(strField, .Cells(.Rows.Count, .Columns.Count), xlValues, xlWhole, intSearchOrder, , True) End With If Not rng Is Nothing Then ' Searched value found. ' Lookup value to retrieve. With rng intRow = .Row - (intOffset * (intSearchOrder = xlByRows)) intColumn = .Column - (intOffset * (intSearchOrder = xlByColumns)) ' Return value, offset intOffset rows or columns from cell with found value. RLookup = .Worksheet.Cells(intRow, intColumn).Value End With Set rng = Nothing End If End Function </code> /gustav >>> ssharkins at gmail.com 21-08-2009 18:36 >>> I'm writing about referencing workbooks and worksheets using VBA. As usual, the hardest part of the entire article is coming up with realistic examples. Right now, I'm stuck with such inventive snippets as Function ActivateWB(wbname As String) 'Activate wbname. Workbooks(wbname).Activate End Function How exciting! ;) If you'd like to share code that uses any VBA method to reference a workbook or worksheet (not charts), I'd be glad to take a look at it. Please send short procedures -- just a few lines. Also, needs to be fairly generic. After all, the syntax is the article's purpose, not the code's purpose. As usual, you'll get a bit of fame, as I'll give you credit for the code in the article. Susan H.