Sub AsignarNumerosAleatoriosPorGrupo()

    Dim ultimaFila As Long
    Dim grupos As Object
    Dim grupo As String
    Dim fila As Long
    Dim numero As Integer
    Dim usados As Object

    Set grupos = CreateObject("Scripting.Dictionary")

    ultimaFila = Cells(Rows.Count, "C").End(xlUp).Row

    Randomize

    For fila = 2 To ultimaFila

        grupo = Trim(Cells(fila, "C").Value)

        If grupo <> "" Then

            If Not grupos.Exists(grupo) Then
                Set grupos(grupo) = CreateObject("Scripting.Dictionary")
            End If

            Set usados = grupos(grupo)

            If usados.Count >= 50 Then
                Cells(fila, "G").Value = "SIN NÚMERO"
            Else
                Do
                    numero = Int((50 * Rnd) + 1)
                Loop While usados.Exists(numero)

                usados.Add numero, True
                Cells(fila, "G").Value = numero
            End If

        End If

    Next fila

    MsgBox "Números asignados correctamente.", vbInformation

End Sub
import csv
import sys
import os
import tempfile
import shutil
from datetime import datetime

FORMATOS_FECHA = [
    "%Y-%m-%d",      # 2000-05-17
    "%d/%m/%Y",      # 17/05/2000
    "%m/%d/%Y",      # 05/17/2000
    "%d-%m-%Y",      # 17-05-2000
    "%Y/%m/%d",      # 2000/05/17
    "%b %d, %Y",     # May 17, 2000
    "%B %d, %Y",     # May 17, 2000
]

def es_numero(valor):
    valor = valor.strip()

    if valor == "":
        return False

    try:
        float(valor)
        return True
    except ValueError:
        return False

def es_fecha(valor):
    valor = valor.strip()

    if valor == "":
        return False

    for formato in FORMATOS_FECHA:
        try:
            datetime.strptime(valor, formato)
            return True
        except ValueError:
            pass

    return False

def convertir_valor(valor):
    valor_limpio = valor.strip()

    if es_numero(valor_limpio):
        if "." in valor_limpio:
            return float(valor_limpio)
        return int(valor_limpio)

    if es_fecha(valor_limpio):
        return FechaSinComillas(valor_limpio)

    return valor

class FechaSinComillas(str):
    pass

class EscritorCSVPersonalizado:
    def __init__(self, archivo, delimiter=","):
        self.archivo = archivo
        self.delimiter = delimiter

    def escribir_fila(self, fila):
        campos = []

        for valor in fila:
            if isinstance(valor, (int, float)):
                campos.append(str(valor))

            elif isinstance(valor, FechaSinComillas):
                campos.append(str(valor))

            else:
                texto = str(valor)
                texto = texto.replace('"', '""')
                campos.append(f'"{texto}"')

        self.archivo.write(self.delimiter.join(campos) + "\n")

def reescribir_csv_textos_con_comillas(ruta_csv):
    if not os.path.isfile(ruta_csv):
        print(f"Error: el archivo no existe: {ruta_csv}")
        sys.exit(1)

    carpeta = os.path.dirname(os.path.abspath(ruta_csv))

    with open(ruta_csv, "r", encoding="utf-8-sig", newline="") as entrada:
        lector = csv.reader(entrada)

        with tempfile.NamedTemporaryFile(
            "w",
            encoding="utf-8",
            newline="",
            delete=False,
            dir=carpeta
        ) as temporal:

            escritor = EscritorCSVPersonalizado(temporal)

            for fila in lector:
                fila_convertida = [convertir_valor(valor) for valor in fila]
                escritor.escribir_fila(fila_convertida)

            ruta_temporal = temporal.name

    shutil.move(ruta_temporal, ruta_csv)

    print(f"Archivo reescrito correctamente: {ruta_csv}")

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Uso:")
        print("python poner_comillas_texto_csv.py archivo.csv")
        sys.exit(1)

    archivo_csv = sys.argv[1]
    reescribir_csv_textos_con_comillas(archivo_csv)