max.wanadoo at gmail.com
max.wanadoo at gmail.com
Sat Nov 3 12:56:16 CDT 2007
Hi Tina, I use a rather long function as shown below. I have actually trimmed this down considerable for your use as it actually does a whole bunch of other things for me. For your requirements this should suffice. It uses concatenation with nulls. This means it stores contents into variants instead of strings (although they are named as string for my own use. Eg strTitle instead of varTitle, change if you prefer). As I say, it is rather lengthy because I never know what data I am going to have and need to have a full address constructed correctly. Hope I have removed anything useful. HTH Max Function tryIt() MsgBox pfFormatPersonAddress(11200) End Function Function pfFormatPersonAddress(lngPID As Long) As String Dim dbs As DAO.Database, rst As DAO.Recordset, sql As String Dim bBadPostalArea As Boolean bBadPostalArea = False ' could be overseas Dim strAddrCode As String Dim lngTitleID As Variant, lngSuffixID As Variant Dim lngFKDistrictID As Variant, lngFKTownID As Variant Dim lngFKCountyID As Variant, lngFKPostalAreaID As Variant Dim lngFKCountryID As Variant Dim strTitle As Variant, strSuffix As Variant Dim strFirstName As Variant, strSecondName As Variant Dim strSurname As Variant Dim strHouseName As Variant, strHouseNum As Variant Dim strStreet As Variant Dim strPostalDistrict As Variant, strIn As Variant Dim strCountry As Variant, strCounty As Variant, strTown As Variant Dim strDefaultPostCode As String Dim strDistrict As Variant Dim varAddr As Variant, strLine As Variant Dim strOverseasPostCode As Variant ' rst variables that are being updated Dim strAddrName As Variant Dim strAddrMembName As Variant Dim strAddrShort As Variant Dim strAddrSingle As Variant Dim strAddrFull As Variant Dim strPostalArea As String Dim lngLocationID As Long Set dbs = CurrentDb sql = "Select * from mcmPeople where PersonID=" & lngPID Set rst = dbs.OpenRecordset(sql) If rst.EOF Then MsgBox "Cannot Find Person With PID: " & lngPID GoTo exithere End If ' Change empty strings to nulls so that empty vars are all set to null ' we can then use the '+' sign to avoid having empty lines If Nz(rst!FKTitleID, 0) = 0 Then lngTitleID = 0 Else lngTitleID = rst!FKTitleID If Nz(rst!FKSuffixID, 0) = 0 Then lngSuffixID = 0 Else lngSuffixID = rst!FKSuffixID If Nz(rst!FKPostalAreaID, 0) = 0 Then lngFKPostalAreaID = 0 Else lngFKPostalAreaID = rst!FKPostalAreaID If Nz(rst!FKDistrictID, 0) = 0 Then lngFKDistrictID = 0 Else lngFKDistrictID = rst!FKDistrictID If Nz(rst!FKTownID, 0) = 0 Then lngFKTownID = 0 Else lngFKTownID = rst!FKTownID If Nz(rst!FKCountyID, 0) = 0 Then lngFKCountyID = 0 Else lngFKCountyID = rst!FKCountyID If Nz(rst!FKCountryID, 0) = 0 Then lngFKCountryID = 0 Else lngFKCountryID = rst!FKCountryID If Len(Trim(rst!FirstName)) = 0 Or rst!FirstName = "" Then strFirstName = Null Else strFirstName = rst!FirstName If Len(Trim(rst!SecondName)) = 0 Or rst!SecondName = "" Or IsNull(rst!SecondName) Then strSecondName = Null Else strSecondName = rst!SecondName End If If Len(Trim(rst!Surname)) = 0 Or rst!Surname = "" Then strSurname = Null Else strSurname = rst!Surname If Len(Trim(rst!HouseName)) = 0 Or rst!HouseName = "" Then strHouseName = Null Else strHouseName = rst!HouseName If Len(Trim(rst!HouseNum)) = 0 Or rst!HouseNum = "" Then strHouseNum = Null Else strHouseNum = rst!HouseNum If Len(Trim(rst!Street)) = 0 Or rst!Street = "" Then strStreet = Null Else strStreet = rst!Street If Len(Trim(rst!PostalDistrict)) = 0 Or rst!PostalDistrict = "" Then strPostalDistrict = Null Else strPostalDistrict = rst!PostalDistrict If Len(Trim(rst!InCode)) = 0 Or rst!InCode = "" Then strIn = Null Else strIn = rst!InCode If Len(Trim(rst!OverseasPostCode)) = 0 Or rst!OverseasPostCode = "" Then strOverseasPostCode = Null Else strIn = rst!OverseasPostCode '============================================================== ' NAMES **************** ' sometime we only have an Initial for the first name If Not IsNull(strFirstName) And Len(strFirstName) = 1 Then strFirstName = strFirstName & "." End If strAddrName = Trim(((strTitle + " ") & (strFirstName + " ") & _ (Left(strSecondName, 1) + ". ") & (strSurname + " ") & (strSuffix + ""))) '& " (" & rst!PersonID & ")" strAddrFull = strAddrName ' only goes into full address If Not IsNull(strHouseName) Then strAddrFull = strAddrFull & vbCrLf & strHouseName End If strLine = (strHouseNum + " ") & (strStreet + " ") If Not Nz(strLine) & "!" = "!" Then strAddrFull = strAddrFull & vbCrLf & strLine End If ' get 3rd line of address or do nothing - not even a blank line strDistrict = Trim(Nz(DLookup("District", "mcmGeoDistricts", "DistrictID=" & lngFKDistrictID), Null)) strAddrShort = strAddrShort & strDistrict & vbCrLf strAddrSingle = strAddrSingle & (strDistrict + ", ") If Not Nz(strDistrict) & "!" = "!" Then strAddrFull = strAddrFull & vbCrLf & strDistrict End If ' get 4th line of address or do nothing - not even a blank line strTown = Trim(UCase$(Nz(DLookup("Town", "mcmGeoTowns", "TownID=" & Nz(lngFKTownID, 0)), " "))) strAddrShort = strAddrShort & (strTown + ", ") strAddrSingle = strAddrSingle & (strTown + ", ") If Not Nz(strTown) & "!" = "!" Then strAddrFull = strAddrFull & vbCrLf & strTown End If ' get 5th line of address or do nothing - not even a blank line If lngFKCountyID = 65 And Left(strTown, 6) = "Dublin" Then ' Skip if County Dublin and Dublin is in the town Else strCounty = Trim(Nz(DLookup("County", "mcmGeoCountys", "CountyID=" & Nz(lngFKCountyID, 0)), Null)) strDefaultPostCode = Trim(Nz(DLookup("FKPostalAreaID", "mcmGeoCountys", "CountyID=" & Nz(lngFKCountyID, 0)), "")) If Trim(Nz(strTown, "")) <> Trim(Nz(strCounty, "")) Then strAddrShort = strAddrShort & (strCounty + ", ") strAddrSingle = strAddrSingle & (strCounty + ", ") If Not Nz(strCounty) & "!" = "!" Then strAddrFull = strAddrFull & vbCrLf & strCounty End If End If End If ' See if we can get a default postcode in there if not one held from the [mcmGeoCountys] Tabls If Nz(rst!FKPostalAreaID, 0) = 0 And Len(Trim(strDefaultPostCode)) > 0 Then lngFKPostalAreaID = DLookup("PostalAreaID", "mcmGeoPostalAreas", "PostalArea='" & strDefaultPostCode & "'") If lngFKPostalAreaID = 0 Then lngFKPostalAreaID = 153 ' ZZ uknown End If If Not rst!FKPostalAreaID = lngFKPostalAreaID Or IsNull(rst!FKPostalAreaID) Then rst!FKPostalAreaID = lngFKPostalAreaID End If End If ' get 6th line of address or do nothing - not even a blank line strPostalArea = Nz(DLookup("Postalarea", "mcmGeoPostalAreas", "PostalAreaID=" & Nz(lngFKPostalAreaID, 0)), "") strLine = Trim(((strPostalArea + "") & (strPostalDistrict + " ") & (strIn + " "))) If InStr("ZZ/OV/IE/IS/IN", Left(strLine, 2)) > 0 Then ' ignore ireland and overseas and unknown Else 'MsgBox lngFKPostalAreaID & vbCrLf & strPostalDistrict & vbCrLf & strLine strAddrShort = strAddrShort & (strLine + ", ") strAddrSingle = strAddrSingle & (strLine + ", ") If Not Nz(strLine) & "!" = "!" Then strAddrFull = strAddrFull & vbCrLf & strLine End If End If strCountry = Nz(DLookup("Country", "mcmGeoCountrys", "CountryID=" & Nz(lngFKCountryID, 0)), Null) If Not InStr("England/Scotland/Wales", strCountry) > 0 Then strAddrShort = strAddrShort & strCountry strAddrSingle = strAddrSingle & strCountry If Not Nz(strCountry) & "!" = "!" Then strAddrFull = strAddrFull & vbCrLf & strCountry End If Else strAddrSingle = Trim(strAddrSingle) If Right(strAddrSingle, 1) = "," Then strAddrSingle = Left(strAddrSingle, Len(strAddrSingle) - 1) strAddrShort = Trim(strAddrShort) If Right(strAddrShort, 1) = "," Then strAddrShort = Left(strAddrShort, Len(strAddrShort) - 1) End If pfFormatPersonAddress = strAddrFull exithere: Set dbs = Nothing: Set rst = Nothing Exit Function errhandler: Select Case Err.Number Case Else MsgBox "Address Error: " & Err.Number & vbCrLf & Err.Description End Select Resume exithere End Function -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Tina Norris Fields Sent: Saturday, November 03, 2007 4:10 PM To: Access Developers discussion and problem solving Subject: [AccessD] Insert a new line in an expression? It seems that this should be easy, but I'm not getting it. I have a table of registered voters with their physical addresses and mailing addresses if other than the physical address. The physical address fields were laid out according to excellent rules, separated into house numbers, directional prefix, roadway name, roadway type, directional suffix, and residential extension. But, the mailing address fields were just MailAddr1, MailAddr2, MailAddr3, MailAddr4, and MailAddr5 text fields, with no consistent data entry rules - so there were PO Box numbers in MailAddr1 or MailAddr2, alone or in combination with city name, state name, and sometimes zip code. In order to use the data for mailing, I spent yesterday cleaning up the mailing address fields so that a "full" street address if any is in MailAddr1, PO Boxes are in MailAddr2, City, State, and Zip are in MailAddr3, MailAddr4, and MailAddr5 respectively. Now, I am trying to generate a report with these addresses. In some cases there are both a street address and a PO Box number, such as 2651 Gunny's Way NE, PO Box 1534. But, I don't want a blank line appearing for blank street addresses or PO Box addresses, so I'm trying to put them together in an expression. What I want to do is insert a carriage return character after the street address to put the PO Box on its own print line. I have this expression so far: =Trim(Iif([MailAddr1] Is Not Null, [MailAddr1]&" ","")&[MailAddr2]) which strings them out nicely, with a space between them. Instead of the " " I want to have ASCII 13 or the Access vba equivalent. I have tried vbCrLf, but Access sticks square brackets around it and demands a value for it as a parameter. (I've tried a bunch of other stuff, too, but just in case this turns out to be way easy, I am not going to spill the beans about my many failed efforts.) How do I do this? TIA Tina -- AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com