|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - Brroz
Páginas: 1 ... 37 38 [39] 40 41 ... 43
951
« en: Martes 2 de Septiembre de 2003, 08:39 »
Fíjate en las líneas siguientes:
Dim objApp As Object ' Aplicación Set objApp = GetObject(, "Excel.Application") Dim objWb As Object ' WorkBook Set objWb = objApp.WorkBooks(1)
'Aquí viene la parte que más te interesa
Dim objSh As Object ' WorkSheet
' Para añadir una hoja y ponerle un nombre: Set objSh = objWb.Worksheets.Add() objSh.Name = "Mi nueva hoja"
'Para obtener la referencia a la última hoja, saber cómo se llama y cambiarle el nombre Set objSh = objWb.Sheets(objWb.Worksheets.Count) MsgBox objSh.Name objSh.Name = "Nuevo nombre"
'Para obtener la referencia a la primera hoja Set objSh = objWb.Sheets(1)
'Para obtener la referencia a una hoja por su nombre Set objSh = objWb.Sheets("Hoja x")
A partir de aquí, ya sabes como va el resto...
Suerte.
952
« en: Martes 2 de Septiembre de 2003, 08:22 »
Para imprimir el informe desde vb fíjate en este ejemplo:
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Function Imprimir(ByVal Formato As String, ByVal Filtro As String _ , Optional ByVal VistaPrevia As Boolean) As Boolean On Error GoTo Error_Imprimir Dim sngMouseP As Single sngMouseP = Screen.MousePointer Screen.MousePointer = 11 DoEvents Dim dbW As Object Set dbW = GetObject("BaseDeDatos.mdb") If VistaPrevia Then ShowWindow dbW.hWndAccessApp, 3 On Error Resume Next dbW.UserControl = False On Error GoTo Error_Imprimir Dim int1 As Integer If VistaPrevia Then int1 = 2 '2 = acViewPreview , 0 = acViewNormal If dbW.Reports.Count = 0 Then dbW.DoCmd.OpenReport Formato, int1, , Filtro Else Dim lng1 As Long For lng1 = 0 To dbW.Reports.Count - 1 If dbW.Reports(lng1).Name = Formato Then dbW.Reports(Formato).Filter = Filtro GoTo Exit_Fn End If Next lng1 dbW.DoCmd.OpenReport Formato, int1, , Filtro End If Exit_Fn: Imprimir = True Salir_Imprimir: On Error Resume Next If Not VistaPrevia Then dbW.Quit Else dbW.DoCmd.Maximize dbW.UserControl = True End If Set dbW = Nothing Screen.MousePointer = sngMouseP Exit Function Error_Imprimir: MsgBox "Fallo al imprimir informe '" & Formato & "'" & String(2, vbCrLf) _ & "(" & Err.Number & ") " & Err.Description, vbCritical, "Imprimir" VistaPrevia = False Resume Salir_Imprimir
End Function
Con respecto a lo de tener varias tablas como origen de registro para tu informe, utiliza como origen de registro para el informe (propiedad RowSource) una consulta de access o instrucción SQL.
Espero que esto te vaya bien. Sort.
953
« en: Martes 2 de Septiembre de 2003, 08:14 »
Puedes abrir los archivos desde vb y compararlos línea a línea con algo así:
Private Function SonIguales(Byval Archivo1 As String, Byval Archivo2 as String) As Boolean
Dim int1 as integer, int2 as integer Dim str1 as string, str2 as string
On Error Goto Error_Comparar
int1 = FreeFile Open "Archivo1" For Input As #int1 int2 = FreeFile Open "Archivo2" For Input As #int2
Do Until Eof(int1) LineInput #int1, str1 LineInput #int2, str2 If str1 <> str2 then Goto Salir_Comparar Loop
If Eof(int2) Then Son Iguales = True
Salir_Comparar: On Error Resume Next Close #int1 Close #int2 Exit Function
Error_Comparar: MsgBox Err.Description Resume Salir_Comparar
End Function
Si la comparación es algo puntual, también podrías utilizar el comando D.O.S. 'FC' (file compare).
Suerte.
954
« en: Martes 2 de Septiembre de 2003, 08:02 »
Exacto. La carpeta no puede contener archivos ni otras carpetas (igual que con el 'RD' de D.O.S.).
Suerte.
955
« en: Lunes 1 de Septiembre de 2003, 14:18 »
En Access puedes recuperar el nombre y vía de acceso de la base de datos actual mediante la propiedad 'Name' del objeto 'CurrentDb'. Si es desde vb con DAO, mira la misma propiedad del objeto que definas como 'Database'. Si usas ADO, en la cadena de conexión tienes la base de datos, como te indica Angel-Mayor. Luego para recuperar el path :
Dim str1 as String str1 = CurrentDb.Name Dim int1 as Integer int1 = InstrRev(str1,"") Dim strDbPath as string strDbPath = Left(str1, int1)
Suerte.
956
« en: Lunes 1 de Septiembre de 2003, 14:10 »
957
« en: Lunes 1 de Septiembre de 2003, 13:31 »
¿Estará vacía la carpeta? Mira a ver. Suerte.
958
« en: Lunes 1 de Septiembre de 2003, 13:27 »
Utiliza el código que te indiqué en http://foros.solocodigo.com/viewthread.php?tid=4724. El valor para cada byte lo obtendrás como elemento de la matriz que le pases como parámetro. Por ejemplo: después de añadir el código aquel, añade este otro para probar en algún sitio. Dim byt1() as Byte PackNro 23434 , byt1 , LittleEndianByteOrder Msgbox "Primer byte " & byt1(1) 'byt1(1) = 138 Msgbox "Segundo byte " & byt1(2) 'byt1(2) = 91 Msgbox "Tercer byte " & byt1(3) 'byt1(3) = 0 Msgbox "Cuarto byte " & byt1(4) 'byt1(4) = 0 Si te das cuenta 23434 = 138 * 256^0 + 91 * 256^1 + 0 * 256^2 + 0 * 256^3 A ver si esto te va bien. Suerte y a ver que tal.
959
« en: Lunes 1 de Septiembre de 2003, 08:39 »
Utiliza un código de este estilo:
Dim int1 As Integer, strRowSource As String, str1(5) as string str1(0) = "Elemento 1" str1(1) = "Elemento 2" str1(2) = "Elemento 3" str1(3) = "Elemento 4" str1(4) = "Elemento 5"
For int1 = LBound(str1) To UBound(str1) strRowSource = strRowSource & str1(int1) & ";" Next int1 With Lista1 .RowSourceType = "Value List" .RowSource = strRowSource .Requery End With
Espero que esto te sirva. Suerte.
960
« en: Sábado 30 de Agosto de 2003, 11:10 »
Prefiero no entrar en debates que nunca conducen a ninguna parte, pero en vista del éxito que está teniendo este post, no puedo evitar escribir algo para dar mi opinión.
Que quede claro que no me parece acertado el uso que Observador hace de este foro para hacerse propaganda. En la página inicial puedes ver una sección 'Ayúdanos a crecer' que es a donde Observador debería acudir. Ahora bien cada cual sabrá a qué foros quiere acudir, participar y en cuál puede encontrar las mejores respuestas a sus dudas.
Más penoso sí que me parece la actitud de "mis respuestas son estupendas y las tuyas una merda": la peor respuesta es la que no se produce. Hablando de foros de calidad, busque, compare y si encuentra algo mejor... Me parece que lo que abunda por ahí es mucho EGO HAMBRIENTO (a ver si alguien se da por aludido).
Por último decir, desviándome del tema, que ya va siendo hora de cambiar de mentalidad en lo relativo a los POBRES LOBOS que bien que llevan pagado esa mala fama que tienen desde tiempos inmemoriables hasta extremos que rozan su extinción. Cada vez que rememoro su aullido en la sierra del Suído se me ponen los pelos de punta...
Saludos para todos y que no llegue la sangre al río.
961
« en: Sábado 30 de Agosto de 2003, 08:59 »
Desconozco la forma de obtener el nº de serie de un equipo y si esto es realmente posible (imagínate el típico pc con una placa de su padre, un micro de su madre y discos del primo segundo...). De todas formas imagino que tal vez necesitas el s/n para OBTENER UN NÚMERO ÚNICO para el equipo. Si esto es así, ahí va un ejemplo sacado del ¿desaparecido? AMBSoftware, copiado tal cual:
***************************************
Generar un número único para un ordenador
Es la función que se usa para crear las claves esas que están en el registro de windows (CLSID) y que el VB6 usa internamente para generar una clave única cuando creamos un nuevo componente ActiveX.
La función está encapsulada en una clase y se usa como cualquier objeto, es decir, declaras el tipo y llamas al método que te interesa, que en este caso es una función que devuelve el valor formateado al estilo de como lo vemos en el registro. El valor devuelto es una cadena en la que, como mínimo, las últimas 8 cifras son siempre las mismas para cada equipo, por tanto, usando esas 8 cifras tienes identificado el equipo.
Parece que si el equipo tiene una tarjeta de red influye en esa cifra, pero si no la tiene, también hace que sea único por lo que puede que ese número cambie si se cambia la tarjeta de red o se instala en un equipo que no tenga.
Option Explicit
Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type
Private Declare Function CoCreateGuid Lib "OLE32.DLL" (pGuid As GUID) As Long Const S_OK = 0 ' return value from CoCreateGuid
Public Function GetGUID() As String Dim lResult As Long Dim lguid As GUID Dim MyguidString As String Dim MyGuidString1 As String Dim MyGuidString2 As String Dim MyGuidString3 As String Dim DataLen As Integer Dim StringLen As Integer Dim i As Integer On Error GoTo error_olemsg lResult = CoCreateGuid(lguid) If lResult = S_OK Then MyGuidString1 = Hex$(lguid.Data1) StringLen = Len(MyGuidString1) DataLen = Len(lguid.Data1) MyGuidString1 = LeadingZeros(2 * DataLen, StringLen) & MyGuidString1 'First 4 bytes (8 hex digits) MyGuidString2 = Hex$(lguid.Data2) StringLen = Len(MyGuidString2) DataLen = Len(lguid.Data2) MyGuidString2 = LeadingZeros(2 * DataLen, StringLen) & Trim$(MyGuidString2) 'Next 2 bytes (4 hex digits) MyGuidString3 = Hex$(lguid.Data3) StringLen = Len(MyGuidString3) DataLen = Len(lguid.Data3) MyGuidString3 = LeadingZeros(2 * DataLen, StringLen) & Trim$(MyGuidString3) 'Next 2 bytes (4 hex digits) MyguidString = MyGuidString1 & "-" & MyGuidString2 & "-" & MyGuidString3 & "-" For i = 0 To 7 MyguidString = MyguidString & Format$(Hex$(lguid.Data4(i)), "00") Next 'MyGuidString contains last 8 bytes of Guid (16 hex digits) GetGUID = MyguidString Else GetGUID = "00000000-0000-0000-0000000000000000" ' return zeros if function unsuccessful End If Exit Function error_olemsg: MsgBox "Error " & Str(Err) & ": " & Error$(Err) GetGUID = "00000000-0000-0000-0000000000000000" Exit Function End Function
Private Function LeadingZeros(ExpectedLen As Integer, ActualLen As Integer) As String LeadingZeros = String$(ExpectedLen - ActualLen, "0") End Function
Para usar la clase:
Private Sub cmdGenGUID_Click() 'Creamos una instancia de la clase Dim tGuid As New cGUID 'Asignamos el número generado, en este ejemplo lo asignamos a un Label Label2 = tGuid.GetGUID 'Destruimos la referencia al objeto Set tGuid = Nothing End Sub
***************************************
Espero que te sea útil. Suerte.
962
« en: Viernes 29 de Agosto de 2003, 11:31 »
Si el informe te lo curras tú utilizando el objeto Printer, no hay problema: utilizando su método PaintPicture podrás imprimir imágenes (ojo con el formato de la imagen, no lo he probado, pero me imagino que por ejemplo un tiff casi seguro que no lo imprime).
Suerte.
963
« en: Viernes 29 de Agosto de 2003, 10:43 »
Hombre, no sé si estarás usando 'CSng' como indicas... si es así, hazlo de este modo: varSingle = CSng(varVariant), donde varSingle es la variable single y varVariant es la variant (evidente). Si ya lo haces así (supongo), entonces es que el valor variant no puede ser convertido a single.
Ya contarás. Suerte.
964
« en: Viernes 29 de Agosto de 2003, 10:03 »
La gestión de la multitarea es cosa de windows. Un proceso que quieras abrir desde vb puede funcionar tanto de forma asíncrona como síncrona. Suele jugar un papel muy importante la instrucción 'DoEvents' que permite que se ejecuten los eventos que estan en cola y permite respirar al resto de tus componentes. Esto, así a grandes rasgos, es lo que te puedo decir sobre multitarea en vb. Ahora bien, en mi ignorancia me da la sensación de que en tu caso el problema está en la captura de imagen de video, que debe ser una labor dedicada (dedicada, no delicada). De hecho, según creo, para poder capturar video con el pc se necesita un puerto firewall para la cámara, con otro puerto corriente y moliente no te funcionaría, lo que da que pensar...
En fin, a ver si algún experto arroja más luz sobre el tema.
Suerte.
965
« en: Viernes 29 de Agosto de 2003, 09:52 »
El siguiente código te permite recuperar como elementos de una matriz las distintas aplicaciones activas.
Private Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwFlags As Long szExeFile As String * 260 End Type
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
Private Type TareaActiva Id As Long ExeFile As String End Type
Private Tareas() As TareaActiva
Private Sub ObtenerProcesos() Dim lngSnapShot As Long Dim Proceso As PROCESSENTRY32 Dim lngRc As Long, lngCta As Long lngSnapShot = CreateToolhelpSnapshot(2&, 0&) If lngSnapShot <> 0 Then Proceso.dwSize = Len(Proceso) lngRc = ProcessFirst(lngSnapShot, Proceso) Do While lngRc lngCta = lngCta + 1 ReDim Preserve Tareas(1 To lngCta) Tareas(lngCta).Id = Proceso.th32ProcessID Tareas(lngCta).ExeFile = Left(Proceso.szExeFile, InStr(Proceso.szExeFile, Chr(0)) - 1) lngRc = ProcessNext(lngSnapShot, Proceso) Loop CloseHandle lngSnapShot End If
End Sub
Suerte.
966
« en: Viernes 29 de Agosto de 2003, 09:47 »
Si el programa lo iniciaste tú, fijate en este ejemplo que ejecuta un programa y si en 1 minuto no acaba por si solo, lo finaliza:
Private Declare Function OpenProcess Lib "Kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long Private Declare Function GetExitCodeProcess Lib "Kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long) Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Sub Someter()
Const STILL_ACTIVE = &H103 Const PROCESS_QUERY_INFORMATION = &H400 Dim lng1 As Long, lngRc As Long Dim intCta as Integer, lngExitCode as long lng1 = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell("MiPrograma.Exe", vbNormalFocus)) Do GetExitCodeProcess lng1, lngRc intCta = intCta + 1 if intCta > 60 Then lngRc = TerminateProcess(lng1 , lngExitCode) Exit Do Else Sleep 1000 DoEvents End If Loop While lngRc = STILL_ACTIVE
End Sub
Suerte.
967
« en: Viernes 29 de Agosto de 2003, 09:03 »
Yo muchas veces he utilizado los informes de access. Esto le permite a un usuario o a mi crear nuevos informes o modificar los existentes sin ninguna compilación. Otra ventaja es que puedo utilizar la presentación preliminar del informe. Todo esto mediante automatización. Para luego incorporar el nuevo informe para ser llamado por el programa vb, utilizo el mantenimiento de una tabla que contiene los datos necesarios para ejecutar el informe desde la aplicación (su nombre, origen de registro, descripción, ...).
Es una idea más. Sort.
968
« en: Viernes 29 de Agosto de 2003, 08:56 »
969
« en: Viernes 29 de Agosto de 2003, 08:52 »
Hola Gerard, encantado...
970
« en: Viernes 29 de Agosto de 2003, 08:49 »
Aparte de la correcta solución que te ha proporcionado J.M.Movilla, pienso en mi atrevimiento, que deberías replantearte el método y lógica de tu código: que abras un formulario no debe provocar que se mueva el puntero del recordset (sin saber más me da la sensación que se está desencadenando un evento en un momento que tú no deseas). Además veo que en los últimos mensajes te preocupas por el valor que muestra un textbox, cosa que debería ser indiferente si al textbox le asignas su valor en el momento adecuado. A lo mejor es mucho decir por mi parte, pero te aconsejaría que repasaras el código que tienes en los distintos eventos. De todas formas, repito que la solución que te brindan debería solventar tu incidencia perfectamente.
Sort.
971
« en: Jueves 28 de Agosto de 2003, 11:26 »
Podrías probar 'empaquetando' los datos con algo así:
Public Enum ByteOrderEnum LittleEndianByteOrder = 0 'Primero el byte menos significativo BigEndianByteOrder = 1 'Primero el byte más significativo End Enum
Public Sub PackNro(ByVal Valor As Long, bytRes() As Byte, Byval ByteOrder as ByteOrderEnum) Dim byt1(1 To 4) As Byte Dim intMaxExp As Integer ReDim bytRes(1 To 4) Valor = Abs(Valor) byt1(1) = 0 byt1(2) = 0 byt1(3) = 0 byt1(4) = 0 Do While intMaxExp <= 4 If Int(Valor / 256 ^ intMaxExp) > 255 Then intMaxExp = intMaxExp + 1 ElseIf intMaxExp = 0 Then byt1(1) = Valor GoTo Salir_PackLong Else Exit Do End If Loop Do Until Valor = 0 byt1(intMaxExp + 1) = Int(Valor / 256 ^ intMaxExp) Valor = Valor - byt1(intMaxExp + 1) * 256 ^ intMaxExp intMaxExp = intMaxExp - 1 Loop Salir_PackLong: If byteOrder = LittleEndianByteOrder Then bytRes = byt1 Else bytRes(1) = byt1(4) bytRes(2) = byt1(3) bytRes(3) = byt1(2) bytRes(4) = byt1(1) End If
End Sub
Ya contarás a ver que tal. Suerte.
972
« en: Jueves 28 de Agosto de 2003, 11:19 »
Ahora que lo pienso se podría hacer al revés de lo que sugería:
Defino una variable, obtengo con VarPtr la dirección del puntero de la variable, paso como parámetro ese puntero y el tamaño deseado para el parámetro y el programita en C sólo tiene que modificar esas posiciones de memoria (eso si que n.p.i. de cómo hacerlo).
Espero que nos cuentes algo. Suerte.
973
« en: Jueves 28 de Agosto de 2003, 11:05 »
Si lo que deseas es hacer un FTP, yo usaría el control Inet o ejecutaría un archivo de proceso por lotes, la pega para tu necesidad sería que el evento que te comentaba no estaría disponible.
Ops! Veo que ya te han dado otras soluciones al problema, mejor así.
Disculpas y suerte.
974
« en: Jueves 28 de Agosto de 2003, 11:02 »
Usa este código a ver que tal.
Private Function Copiar(Byval Origen as string, Byval Destino as string) as Boolean Dim intO as integer, intD as integer, byt1() as Byte On Error Goto Error_Copiar intO = FreeFile Open Origen For Binary as #intO ' En el caso de que el fichero no fuera muy grande. Redim byt1(1 to Lof(intO)) 'Si el fichero es demasiado grande, deberás implementar un buffer dimensionando 'byt1' al tamaño que tu veas y haciendo un bucle hasta que llegues a la longitud del fichero. intD = FreeFile Open Destino For Binary as #intD Get #intO,,byt1 Put #intD,,byt1 Copiar = True Salir_Copiar: On Error resume next Close #intO Close #intD Exit Function Error_Copiar: MsgBox Err.Description Resume Salir_Copiar End Function
Suerte.
975
« en: Miércoles 27 de Agosto de 2003, 09:21 »
El ejemplo que te da Giomar suma el número de facturas, pero supongo que tú necesitas sumar los importes de las lineas, con lo que abría que utilizar un SQL tal que así:
SELECT Sum(CampoImporte) FROM LineasFacturas WHERE NumFactura = '001' GROUP BY NumFactura
Si como dices en un mensaje más abajo prefieres la opción del 'acumulador', entonces añade una pregunta filtrando los valores que te interesen antes de sumar:
If Datagrid1.Columns(IndiceClave).Value = "001" Then acumulador=acumulador+Datagrid1.Columns(IndiceDeColumna_a_Sumar).Value
Esto te irá algo más lento pero...
Sort.
Páginas: 1 ... 37 38 [39] 40 41 ... 43
|
|
|