Numero a letras con excel vbasic (para recibos, cheques, etc)

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • coco
    ...
    • 30-09-2006
    • 9804

    #1

    Numero a letras con excel vbasic (para recibos, cheques, etc)

    Encontré una rutina por ahí en la web con algunos defectos, la arreglé y la pongo por si alguien la necesita. Hay que HABILITAR las macros, arrancar el editor VBasic (en excel Alt+F11). Ir a ThisWorkgroup, Click derecho, Insertar, módulo, y pegar el código que dejo abajo.
    Se crea una función nueva poner por ejemplo en una celda: =num2let( 1235,54 )&"pesos"
    y escribe en texto el número en cuestión.

    Function num2let(importe)
    If importe >= 1000000000 Then
    num2let = "muygrande "
    Exit Function
    End If
    If Int(importe) = 0 Then num2let = "cero "
    If importe >= 1000000 Then
    millones = Int(importe / 1000000)
    importe = importe - millones * 1000000
    If millones < 2 Then num2let = "un millón " Else num2let = num2letras(millones) + "millones "
    End If
    If importe >= 1000 Then num2let = num2let + num2letras(Int(importe / 1000)) + "mil "
    num2let = num2let + num2letras(Int(importe - Int(importe / 1000) * 1000))
    'centavos:
    If importe <> Int(importe) Then
    ' (para que sea con letras descomentar próxima línea, y comentar la siguiente)
    ' num2let = num2let + "con " + num2letras((importe - Int(importe)) * 100) + "centavos "
    num2let = num2let + "con " + CStr(Int((importe - Int(importe)) * 100)) + "/100 "
    End If

    End Function

    Function num2letras(importe)
    'Pasa de numero a letras, importes entre 0 y 999

    If importe = 100 Then
    num2letras = "cien "
    Exit Function
    End If

    centena2 = Int(importe / 100)
    Select Case centena2
    Case 0: num2letras = ""
    Case 1: num2letras = "ciento "
    Case 2: num2letras = "doscientos "
    Case 3: num2letras = "trescientos "
    Case 4: num2letras = "cuatrocientos "
    Case 5: num2letras = "quinientos "
    Case 6: num2letras = "seiscientos "
    Case 7: num2letras = "setecientos "
    Case 8: num2letras = "ochocientos "
    Case 9: num2letras = "novecientos "
    End Select

    decena2 = Int((importe - centena2 * 100) / 10)
    unidad2 = Int((importe - centena2 * 100 - decena2 * 10))

    If decena2 = 0 Then
    Select Case unidad2
    'Case 0: num2letras = num2letras + "cero "
    Case 1: num2letras = num2letras + "un "
    Case 2: num2letras = num2letras + "dos "
    Case 3: num2letras = num2letras + "tres "
    Case 4: num2letras = num2letras + "cuatro "
    Case 5: num2letras = num2letras + "cinco "
    Case 6: num2letras = num2letras + "seis "
    Case 7: num2letras = num2letras + "siete "
    Case 8: num2letras = num2letras + "ocho "
    Case 9: num2letras = num2letras + "nueve "
    End Select
    Exit Function
    End If

    If decena2 = 1 Then
    Select Case unidad2
    Case 0: num2letras = num2letras + "diez "
    Case 1: num2letras = num2letras + "once "
    Case 2: num2letras = num2letras + "doce "
    Case 3: num2letras = num2letras + "trece "
    Case 4: num2letras = num2letras + "catorce "
    Case 5: num2letras = num2letras + "quince "
    Case 6: num2letras = num2letras + "dieciseis "
    Case 7: num2letras = num2letras + "diecisiete "
    Case 8: num2letras = num2letras + "dieciocho "
    Case 9: num2letras = num2letras + "diecinueve "
    End Select
    Exit Function
    End If

    If decena2 = 2 Then
    Select Case unidad2
    Case 0: num2letras = num2letras + "veinte "
    Case 1: num2letras = num2letras + "veintiun "
    Case 2: num2letras = num2letras + "veintidos "
    Case 3: num2letras = num2letras + "veintitres "
    Case 4: num2letras = num2letras + "veinticuatro "
    Case 5: num2letras = num2letras + "veinticinco "
    Case 6: num2letras = num2letras + "veintiseis "
    Case 7: num2letras = num2letras + "veintisiete "
    Case 8: num2letras = num2letras + "veintiocho "
    Case 9: num2letras = num2letras + "veintinueve "
    End Select
    Exit Function
    End If

    Select Case decena2
    Case 3: num2letras = num2letras + "treinta "
    Case 4: num2letras = num2letras + "cuarenta "
    Case 5: num2letras = num2letras + "cincuenta "
    Case 6: num2letras = num2letras + "sesenta "
    Case 7: num2letras = num2letras + "setenta "
    Case 8: num2letras = num2letras + "ochenta "
    Case 9: num2letras = num2letras + "noventa "
    End Select

    Select Case unidad2
    Case 1: num2letras = num2letras + "y un "
    Case 2: num2letras = num2letras + "y dos "
    Case 3: num2letras = num2letras + "y tres "
    Case 4: num2letras = num2letras + "y cuatro "
    Case 5: num2letras = num2letras + "y cinco "
    Case 6: num2letras = num2letras + "y seis "
    Case 7: num2letras = num2letras + "y siete "
    Case 8: num2letras = num2letras + "y ocho "
    Case 9: num2letras = num2letras + "y nueve "
    End Select

    End Function
    Editado por última vez por coco; 31-08-2010, 06:37 PM.
  • CoyoteX
    Son Goku
    • 16-09-2005
    • 17784

    #2
    donde la encontraste? que defectos tenia? jaja que ladris

    Comentario

    • coco
      ...
      • 30-09-2006
      • 9804

      #3
      Originalmente publicado por CoyoteX
      donde la encontraste? que defectos tenia? jaja que ladris
      Yo ya había programado eso en pascal hace tiempo, en VBasic no programé pero es similar a VFox o Basic que sí domino. La rutina original era complicada al pedo y no andaba bien en todos los casos, la modifiqué bastante, escribía los centavos en letras en lugar de 39/100 como ponemos acá y además decía euros. Supongo que lo que hice le puede servir a alguien más, por eso lo dejo acá. La original además tenía instrucciones poco claras. La original está acá: http://www.neoteo.com/excel-converti...s-a-letras.neo
      Editado por última vez por coco; 31-08-2010, 05:20 PM.

      Comentario

      • CoyoteX
        Son Goku
        • 16-09-2005
        • 17784

        #4
        es extrañamente muy parecida a una rutina que arme hace bastante, le cambiaron los nombres de variables y un par de boludeces, pero es muy dificil que alguien ponga los comentario en el mismo lugar e igual

        Comentario

        • MoaLaiSkirulais
          ^^(V)^^
          • 08-07-2003
          • 23268

          #5
          "num2let" q asco...

          Comentario

          • acha
            Mega Egelito
            • 10-11-2004
            • 3902

            #6
            Originalmente publicado por DI MARIA
            "num2let" q asco...
            el nombre del metodo lo es todo

            Comentario

            • coco
              ...
              • 30-09-2006
              • 9804

              #7
              Ahí lo modifiqué para millones (editada en el primer post), traté de mejorarla más, pero el vbasic no es recursivo (o al menos no tuve ganas de averiguar cómo hacer variables locales). Coyotex, no creo que te la hayan afanado, probablemente los comentarios(que ya borré) son los que cualquiera pondría.

              Mi original en pascal que no tiene nada que ver:

              const
              arrNumS : array[0..15] of string[7] = ('cero', 'uno', 'dos',
              'tres', 'cuatro', 'cinco', 'seis', 'siete', 'ocho', 'nueve',
              'diez', 'once', 'doce', 'trece', 'catorce', 'quince' );
              arrDecS : array[1..9] of string[9] = ('diez', 'veinte', 'treinta',
              'cuarenta', 'cincuenta', 'sesenta', 'setenta', 'ochenta', 'noventa' );

              {$ifDef stk} {$S+} {$endIf}
              function numSToLetrasS(un: boolean; numS: Tstr31): Tstr131;
              var
              i, errP : integer;
              ok : boolean;
              millS, intS, fracS, t : Tstr23;
              s : Tstr131;
              begin
              s:='';
              fracS:='';
              intS:=numS;
              i:=pos('.',numS);
              if i>0 then
              begin
              intS[0]:=char(i-1);
              fracS:=copy(numS,i+1,2);
              end;
              if byte(intS[0])>6 then {millones}
              begin
              millS:=getLft(intS,byte(intS[0])-6);
              getRgtP(intS,6);
              s:=numSToLetrasS(true, millS);
              if s<>'' then
              begin
              if s='un' then s:='un millon ' else s:=s+' millones ';
              end;
              end;
              if byte(intS[0])>3 then {miles}
              begin
              millS:=getRgt(getLft('000'+intS,byte(intS[0])),3);
              getRgtP(intS,3);
              if millS<>'000' then
              begin
              if millS<>'001' then s:=s+numSToLetrasS(true, millS)+' ';
              s:=s+'mil ';
              end;
              end;
              intS:=getRgt('000'+intS,3);
              t:='';
              case intS[1] of
              '1':
              begin
              t:='ciento ';
              if intS='100' then t:='cien ';
              end;
              '5':t:='quinientos ';
              '7':t:='setecientos ';
              '9':t:='novecientos ';
              '2'..'8':t:=arrNumS[byte(intS[1])-byte('0')]+'cientos ';
              end; {case}
              s:=s+t;
              ok:=true;
              case intS[2] of
              '0':
              begin
              t:=arrNumS[byte(intS[3])-byte('0')];
              case intS[3] of
              '1': if un then t:='un';
              '0': if un or (s<>'') then t:='';
              end; {case}
              end;
              '1':
              begin
              ok:=intS[3]<'6';
              t:=arrNumS[byte(intS[3])-(byte('0')-10)];
              end;
              else ok:=false;
              end; {case}
              if not ok then
              begin
              t:=arrDecS[byte(intS[2])-byte('0')];
              if intS[3]<>'0' then t:=t+' y '+arrNumS[byte(intS[3])-byte('0')];
              if un and (intS[3]='1') then dec(t[0]); {uno -> un}
              end;
              s:=s+t;
              val(fracS,i,errP);
              if (i<>0) and (errP=0) then
              begin
              s:=s+' con '+numSToLetrasS(un,fracS);
              end;
              numSToLetrasS:=delRgtSpc(s);
              end; { f numSToLetrasS( }
              {$ifDef noStk} {$S-} {$endIf}
              Editado por última vez por coco; 31-08-2010, 07:23 PM.

              Comentario

              Trabajando...