I am creating unique ids on excel based on several variables like, name of the farmer, name of the field, hectares- to see how many times these variables match, and whether these fields could again be used for certain crops that do not prosper under monocropping. I created some manually intuitively- like “MT18MG3” for “Mattern, Tobias”(name of the farmer) “1.8 ha”(hectares) “Mittelgewanne 3.”(field name) the problem now is, there are several of these fields with these names, and i dont know if i am repeating the same unique id after a few hundred entries.
Now can i do this on any other software like R studio where i get these values with accuracy?
I used VBA, concatenate, hash values etc on xl, but after generating a few unique ids the way i like, xl is either repeating some values, or creating some that make no sense whatsoever.
Isaac_v is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
3
I would personally use vba to solve this problem.
It is possible to create a module where it takes data directly from the cells and behaves as a function, and I would also add the possibility of a suffix with the timestamp thus making unique ids.
How the Function Works:
First, the function takes the main variables: the first two characters of the farmer’s name, the field size (without the decimal point), the first two characters of the field name, and the field number. All this is concatenated to form the ID.
For example:
farmer = "Mattern, Tobias"
field = "Mittelgewanne"
hectares = 1.8
field number = 3
generated ID would look like:
Ma18Mi3
Now, if you want to ensure that the ID is truly unique, you can opt to add a timestamp (the current date and time) at the end. This is useful when there is a risk of repetition. With the timestamp, the ID would look like this:
Ma18Mi3_17120030
In this case, the timestamp represents the day, hour, minute, and second (feel free to add or remove fields if preferred) when the ID was generated, ensuring it never repeats.
Implementing the Function in VBA:
To use this function in Excel, you need to add the VBA code to a module:
the code below:
Function GerarIDUnico(farmer As String, hectares As Double, field_name As String, field_number As Integer, Optional incluirTimestamp As Boolean = False) As String
' This function generates a unique ID based on the provided variables and optionally adds a timestamp suffix for uniqueness
Dim firstTwoFarmer As String
Dim hectaresNoDot As String
Dim firstTwoField As String
Dim uniqueID As String
Dim timestampSuffix As String
' Get the first two characters of the farmer's name
firstTwoFarmer = Left(farmer, 2)
' Convert hectares to string and remove the decimal point
hectaresNoDot = Replace(CStr(hectares), ".", "")
' Get the first two characters of the field name
firstTwoField = Left(field_name, 2)
' Concatenate the values to create the unique ID
uniqueID = firstTwoFarmer & hectaresNoDot & firstTwoField & field_number
' If the incluirTimestamp parameter is true, add a timestamp suffix
If incluirTimestamp Then
' you can change to yyyymmddhhmmss for year and month
timestampSuffix = Format(Now(), "ddhhmmss")
uniqueID = uniqueID & "_" & timestampSuffix
End If
' Return the final ID
GerarIDUnico = uniqueID
End Function
How to Use:
Without the timestamp (normal mode):
=GerarIDUnico(A2, B2, C2, D2, FALSE)
With the timestamp (to ensure uniqueness):
=GerarIDUnico(A2, B2, C2, D2, TRUE)
The function is very flexible, so you can choose when to activate the timestamp or not.
You can test the code online here:
https://onlinegdb.com/tLydVR_Lj
Sorry, some translation error, my English is not the best
As I wrote as comment: Don’t put logic into the ID. Just use a simple number.
(1) If you have an Excel sheet with data (but without IDs), you can use the following script to generate missing IDs. Put the code into a regular module.
Just adapt the column where you want to store the ID (currently, it assumes that you have the IDs in column A
) and change the worksheet in the With
-statement if your data doesn’t live in the first sheet. Also, replace the “B” in .Range("B1").CurrentRegion
with a column of your data that is always filled (eg the farmer name).
Global Const IDColumn = "A"
Sub GenerateAllIds()
With ThisWorkbook.Sheets(1) ' Change to your worksheet
Dim row As Long, lastRow As Long
lastRow = .Range("B1").CurrentRegion.Rows.Count
For row = 2 To lastRow
If IsEmpty(.Cells(row, IDColumn)) Then
.Cells(row, IDColumn) = WorksheetFunction.Max(.Cells(1, IDColumn).EntireColumn) + 1
End If
Next row
End With
End Sub
You need to run the code only once, eg by pressing F5 in the VBA editor or by using the Macros dialog in Excel.
(2) If you fill in the sheet manually and want to add an ID to the row whenever new data is entered, put the following code into the Worksheet module of the sheet where your data is located:
Private Sub Worksheet_Change(ByVal Target As Range)
' Use error handler to ensure that events are switched on again
On Error GoTo change_Exit
' disable events to prevent recursive calls.
Application.EnableEvents = False
With Target.Parent ' (Target.Parent is the active sheet)
' Allow to delete full rows or columns
If Target.Columns.Count = .Columns.Count Or Target.Rows.Count = .Rows.Count Then GoTo change_Exit
' Not allowed to modify column A
If Not Intersect(Target, .Cells(1, IDColumn).EntireColumn) Is Nothing Then
MsgBox "Don't modify the ID column."
Application.Undo
GoTo change_Exit
End If
' Create IDs for newly entered data
Dim cell As Range
For Each cell In Target.Cells
If cell.Value <> "" And IsEmpty(.Cells(cell.row, IDColumn).Value) Then
' Create new ID
.Cells(cell.row, IDColumn) = WorksheetFunction.Max(.Cells(1, IDColumn).EntireColumn) + 1
End If
Next cell
End With
change_Exit:
' enable events
Application.EnableEvents = True
End Sub