Den sön 14 apr. 2019 kl 21:53 skrev Johnny Rosenberg <[email protected] >:
> Hi! > As we know by now, in LibreOffice Basic we can not copy an array directly, > we will only get a new name for the same array. It's like assigning two > array pointers to the same array. The obvious way to copy an array is to do > it element by element in a loop, but there is a workaround. Here's an > example that works: > > > > > > > > > > > > > > > > > > > > > *Option ExplicitSub Test1 Dim A(9) As Long Dim i As Integer' > Initialise a: For i=0 To 9 A(i)=i Next i' Copy A to B: > Dim B(9) As Long: B=A ReDim Preserve B(9)' Do some changes to B > without affecting A: B(7)=A(3) B(3)=A(7)* > *' Display the results:* > > > > > > > > * Dim Message As String, Tab As String, NL As String, Spc As String > Tab=Chr(9): NL=Chr(13): Spc=" " Message="i" & Tab & "A(i)" & Tab & > "B(i)" & NL For i=0 To 9 Message=Message & i & Tab & Spc & A(i) & > Tab & Spc & B(i) & NL Next i MsgBox MessageEnd Sub* > > So, the trick in this case is to first assign B to A, then running the > ReDim statement. After that we have two separate arrays. > > However, I want to do this with a custom type, like so: > > > > *Private Type NumberType Value As Long Status As BooleanEnd > Type* > > > > > > > > > > > > > > > > *Sub Test2 Dim A(9) As NumberType Dim i As Integer' Initialise > a. For i=0 To 9 A(i).Value=i A(i).Status=True Next > i' Copy A to B Dim B(9) As NumberType: B=A ' ”Basic runtime error: > Object required.” ReDim Preserve B(9)End Sub* > > This will throw a runtime error at *B=A* at third line from the end: > ”Basic runtime error: Object required”. What am I missing? How to do this > properly? > > > Kind regards > > Johnny Rosenberg > > OK, to get rid of the error the keyword ”Let” was required. So finally I know what that's for… This code doesn't give me any errors, but the results are not right: *Option Explicit* *Private Type NumberType Value As Long Status As BooleanEnd Type* *Private Sub Test2 Randomize Dim A(9) As NumberType Dim i As Integer' Initialise a. For i=0 To 9 A(i).Value=i A(i).Status=True Next i' Copy A to B Dim B(9) As New NumberType: Let B=A ReDim Preserve B(9)' Do some changes to B without affecting A: B(7).Value=A(3).Value B(3).Value=A(7).Value B(3).Status=False B(7).Status=False Dim Message As String, Tab As String, NL As String: Tab=Chr(9): NL=Chr(13) Dim Spc1 As String, Spc2 As String: Spc1=" ": Spc2=" " Message="i" & Tab & "A(i)" & Tab & Tab & Tab & "B(i)" & NL For i=0 To 9 Message=Message & i & Tab & Spc2 & _ A(i).Value & Spc1 & _ A(i).Status & Tab & Tab & Spc2 & _ B(i).Value & Spc1 & _ B(i).Status & NL Next i MsgBox MessageEnd Sub* It seems like ReDim Preserve has no effect in this case. A and B are still pointers to the same array, as it seems. Suggestions? Except assigning all the values in loops, because I already know that… Kind regards Johnny Rosenberg -- To unsubscribe e-mail to: [email protected] Problems? https://www.libreoffice.org/get-help/mailing-lists/how-to-unsubscribe/ Posting guidelines + more: https://wiki.documentfoundation.org/Netiquette List archive: https://listarchives.libreoffice.org/global/users/ Privacy Policy: https://www.documentfoundation.org/privacy
