Frank K Hosaka
Membros-
Total de itens
1.678 -
Registro em
-
Última visita
Tudo que Frank K Hosaka postou
-
Não sei se isso vai ajudar, mas eu descobri que fiz uma enorme confusão entre imagem e gráfico, o Copilot me ensinou a criar um gráfico. Primeiro criei uma planilha chamada gráficos, na coluna A1 coloquei Ano, e abaixo dela coloquei 20, 21, 22, 23, 24, 25; na coluna B1 coloquei Popularidade, e abaixo dela coloquei 5, 4, 3, 2, 1, 0. Pedi para o Copilot criar um código VBA (no ambiente da planilha gráficos) e em seguida salvar o arquivo. Isso está longe de resolver o seu problema, mas acredito que ele pode ajudar a conhecer melhor o VBA: Sub CriarEGerarGrafico() Dim ws As Worksheet Dim grafico As ChartObject Dim pastanome As String Dim currentchart As Chart ' Define a planilha onde os dados estão localizados Set ws = Worksheets("gráficos") ' Verifica se já existe um gráfico na planilha e o remove For Each grafico In ws.ChartObjects grafico.Delete Next grafico ' Adiciona um novo gráfico Set grafico = ws.ChartObjects.Add(Left:=100, Width:=375, Top:=50, Height:=225) ' Define a origem dos dados para o gráfico With grafico.Chart .SetSourceData Source:=ws.Range("A1:B6") .ChartType = xlLineMarkers ' Define o tipo de gráfico como linha com marcadores ' Define os títulos do gráfico e dos eixos .HasTitle = True .ChartTitle.Text = "Popularidade ao Longo dos Anos" .Axes(xlCategory, xlPrimary).HasTitle = True .Axes(xlCategory, xlPrimary).AxisTitle.Text = "Ano" .Axes(xlValue, xlPrimary).HasTitle = True .Axes(xlValue, xlPrimary).AxisTitle.Text = "Popularidade" End With ' Salva o gráfico como imagem no mesmo diretório da pasta de trabalho Set currentchart = grafico.Chart pastanome = ThisWorkbook.Path & Application.PathSeparator & "grafico1.gif" currentchart.Export Filename:=pastanome, filtername:="gif" MsgBox "Gráfico criado e salvo com sucesso em: " & pastanome End Sub
-
Hoje, apareceu outro problema, a soma das vendas na Bling deu R$ 15.448,23 mas no PHP deu R$ 15.448,22, ou mais precisamente R$ 15.448,224999. Todas as soluções anteriores não deram certo, hoje tentei uma nova gambiarra: function aint($valor) { return ceil($valor*100)/100; }
-
Copilot: Sim, você pode criar um código VBA para copiar o login e a senha da tabela e colar onde for necessário. Vou fornecer um exemplo de como você pode fazer isso no Excel: ```vba Sub CopiarLoginSenha() Dim ws As Worksheet Dim login As String Dim senha As String Dim link As String Dim destino As Worksheet ' Definir a planilha de origem e a planilha de destino Set ws = ThisWorkbook.Sheets("Planilha1") ' Planilha de origem com os dados Set destino = ThisWorkbook.Sheets("Planilha2") ' Planilha de destino onde os dados serão colados ' Loop através da tabela de dados na Planilha1 For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row link = ws.Cells(i, 1).Value login = ws.Cells(i, 2).Value senha = ws.Cells(i, 3).Value ' Exemplo de uso dos dados copiados ' Você pode modificar esta parte para colar os dados onde precisar destino.Cells(i, 1).Value = link destino.Cells(i, 2).Value = login destino.Cells(i, 3).Value = senha ' Mensagem de confirmação MsgBox "Dados do link: " & link & ", login: " & login & " e senha: " & senha & " copiados com sucesso!", vbInformation Next i End Sub ``` Neste exemplo, o código VBA percorre a tabela de dados na "Planilha1" e copia o link, o login e a senha para a "Planilha2". Você pode modificar este exemplo para colar os dados onde for conveniente para o seu caso específico. Para adicionar este código ao seu projeto do Excel: 1. Pressione `Alt + F11` para abrir o Editor do VBA. 2. Clique em `Inserir` > `Módulo` para criar um novo módulo. 3. Copie e cole o código acima no módulo. 4. Feche o Editor do VBA. 5. No Excel, pressione `Alt + F8` para abrir a janela de macros, selecione `CopiarLoginSenha` e clique em `Executar`. Espero que isso ajude! Se precisar de mais alguma coisa, estou aqui para ajudar. 😊
-
Na pasta Controller, eu tenho uma classe chamada Outros, e dentro dele criei o seguinte método: function teste() { return "olá mundo!"; } Na pasta Routes, eu criei uma nova rota no web.php: Route::get('teste',[Outros::class,'teste']); E, finalmente, testei no navegador com o comando localhost:8000/teste e a resposta foi 409 not found. Conversei com o Copilot, e ele disse que 99% dos problemas acontecem por erro de digitação, ele pediu para reiniciar o servidor ("php artisan serve"), e muitas instruções estranhas que decidi não seguir. Usei o velho motor de busca do Google "409 not found" e por sorte o primeiro tópico falava do Laravel. O rapaz disse para usar o comando php artisan route:clear e em seguinda php artisan route:list, e verificar se o novo método está na lista. O Laravel é bacana, mas tem hora que ele me tira do sério.
-
Eu queria debitar duas contas e creditar uma conta, mas não consegui: function teste() { $hoje=date('Y-m-d'); $lcto=tbdiario::max('lcto')+1; tbdiario::insert([ ['dia'=>$hoje,'lcto'=>$lcto,'contad'=>121,'valor'=>87.16], ['dia'=>$hoje,'lcto'=>$lcto,'contad'=>407,'valor'=>1.84], ['dia'=>$hoje,'lcto'=>$lcto,'contac'=>304,'valor'=>89.00] ]); $lcto++; tbdiario::create(['dia'=>$hoje,'lcto'=>$lcto,'contad'=>121,'valor'=>87.16]); tbdiario::create(['dia'=>$hoje,'lcto'=>$lcto,'contad'=>407,'valor'=>1.84]); tbdiario::create(['dia'=>$hoje,'lcto'=>$lcto,'contac'=>304,'valor'=>89.00]); return redirect('diarioInicio'); }
-
<?php class Diario { function historico(Request $request) { if(is_numeric($request->hist)) { if(strpos($request->hist,'.') !== false) { $hist=tbdiario::where('valor',$request->hist) ->orderBy('dia','desc')->get(); } else { $hist=tbdiario::where('lcto',$request->hist) ->orderBy('dia','desc')->get(); } } else { $h=str_replace(' ','%',$request->hist); $hist=tbdiario::where('hist','like',"%$h%") ->orderBy('dia','desc')->get(); } return view('diarioHistorico',['hist'=>$hist]); } }
-
A minha função aint( ) não ajudou muito, hoje de manhã encontrei o seguinte: 3.447,30 - 3.446,01 = 1.28. Fiz um novo ajuste na função, usei um número parecido com o episolon (10**(-7) ou 10**(-16)), só que o meu é um pouco maior. function aint($valor) { return intval($valor*100 + 0.0001)/100; } e a fórmula que usei no formulário ficou assim: <?=dec(abs(aint(aint($p->valor) - aint($p->fim))))?> Hoje deu certo. Espero que ele funcione amanhã, também.
-
Eu tinha um formulário assim <select onchange="location.replace(`vendaInicio(${this.value})`)" name=detalhe class="bg-transparent"> <?php foreach($grupos as $grupo): ?> <option value="<?=date('d/m/y',strtotime($grupo->ddia))?>" <?php if($detalhe==$grupo->ddia) echo "selected"; ?>> <?=date('d/m/y',strtotime($grupo->ddia))?> -> <?=dec($grupo->ttotal)?> </option> <?php endforeach;?> </select> Mas ele só funcionava uma única vez, ele criava uma solicitação tipo vendaInicio(18/02/25), mas quando selecionava outra data, a solicitação saia assim vendaInicio(18/02/vendaInicio(15/02/25). Eu não entendi porque esse problema aconteceu. Pode ser que a culpa não seja do JavaScript, mas sim do meu roteador: arquivo index.php <?php require('config.php'); $requestUri = $_SERVER['REQUEST_URI']; $path = substr($requestUri, strlen($basePath)); if ($path == "") { $path = "loginLogin"; } if (!strpos($path, '(')) { $path .= '()'; } if (preg_match('/^([a-z]+)([A-Z][a-zA-Z]*)\((.*)\)$/', $path, $matches)) { $classe = $matches[1]; $metodo = $matches[2]; $argumentos = explode(',', $matches[3]); $argumentos = array_map('urldecode', $argumentos); if (!empty($argumentos[0]) && !empty($argumentos)) { $classe::$metodo(...$argumentos); } else { $classe::$metodo(); } } else { echo "Formato de URL inválido."; } ?> Mas, eu não fui capaz de resolver o problema. Ao invés disso, mudei a função Venda::inicio($argumento) para Venda::inicio( ), e coloquei a caixa de seleção dentro de um <form>, e tudo funciona como eu espero. Até agora eu não vi nenhum problema em usar a classe estática ao invés da instância da classe, esse é o primeiro caso que enfrentei esse tipo de problema.
-
Tentei copiar o código Laravel para o formulário de login no PHP, e não deu certo. Imaginei que a diferença entre o Laravel e o PHP fosse a tecnologia Vite, então instalei o Tailwind no notebook, e também não deu certo. Então decidi usar o famoso método da tentativa e erro, e fazer com que o login do PHP fosse mais ou menos parecido com o do Laravel, usando o CDN do Tailwind (o JavaScript reclama que ele não deve ser usado no modo produção, mas é uma das poucas coisas que funciona), e eu consegui: arquivo loginView.php <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script src="https://cdn.tailwindcss.com"></script> <div class="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-gray-100"> <h1 class=text-xl>Projeto Chirper</h1> <main class="w-full sm:max-w-md mt-6 px-6 py-4 bg-white shadow-md overflow-hidden sm:rounded-lg"> <form method="post" action=loginMenu> <div> <label for="email" class=block>Email</label> <input class="w-full p-2 border border-gray-300 rounded-lg focus:outline-blue-700" id="email" type="email" name="email" required="required" autofocus="autofocus" autocomplete="username"> </div> <div class="mt-4"> <label for="password" class=block>Senha</label> <input class="w-full p-2 border border-gray-300 rounded-lg focus:outline-blue-700" id="password" type="password" name="password" required="required" autocomplete="current-password"> </div> <div class="flex items-center justify-end mt-4"> <button class="inline-flex items-center px-4 py-2 bg-gray-500 rounded-md font-semibold text-xs text-white uppercase"> Entrar </button> </div> </form> </main> </div>
-
A minha tela de login no projeto php é um horror na tela do celular, ele só aparece a metade do formulário no modo retrato. Tentei estudar o Laravel para ver como ele consegue colocar todo o formulário do login tanto no modo retrato como no modo paisagem no celular, mas eu não consegui apurar aonde começa o código e onde termina. Pedi ajuda para o Copilot, e ele me arranjou dois arquivos, o HTML e o CSS. Peguei o terminal do VS Code e digitei php -S 0.0.0.0:8000 e no celular eu digitei 192.168.0.4:8000, e comecei a estudar a tal da responsividade. O arquivo CSS é enorme, mas fiquei imaginando como ficaria o celular sem o CSS. O celular continuou funcionando, e diminui todo o HTML nos seguintes códigos: <form> <h2>Login</h2> <div> <input type="text" id="username" name="username" required placeholder="Usuário"> </div> <div> <input type="password" id="password" name="password" required placeholder="Senha"> </div> <input type="submit"> </form> Ou seja, o HTML é responsivo. O CSS é pura perfumaria.
-
Na imagem abaixo eu encontrei uma pequena diferença de R$ 0,01, ele é resultado da equação: C = aint(B - A). Para tentar resolver esse problema, eu improvisei assim: C = aint(B) - aint(A). Ele resolveu o meu problema agora. Não sei se dá para usar essa solução por toda a vida. a função aint que eu criei é essa: <?php function aint($valor) { return intval($valor*100)/100; }
-
Ao invés de conectar o Excel no MySQL remoto, eu pensei em jogar no PHP o serviço do Excel. Criei uma tabela chamada previsão, criei uma classe previsão e também uma imagem previsão. Se eu conseguir terminar o serviço, vou poder fazer as tarefas no celular, não vou mais depender do laptop: arquivo previsao.php <?php class previsao { static function alterar() { $previsao=deca($_POST['previsao']); $conta=$_POST['conta']; bd::x("update tbprevisao set valor=:valor where conta=:conta", ['valor'=>$previsao,'conta'=>$conta])->getx(); return self::inicio(); } static function inicio() { balancete::tbw(1); $painel=bd::x("select * from tbprevisao join tbw on tbprevisao.conta = tbw.conta")->get(); return view('previsaoView',['painel'=>$painel]); } } <?php require('menuView.php'); ?> <script>btMenu.innerHTML="Previsão";document.title="Previsão"</script> <div class="flex"> <div class="w-[50px] text-right">Conta</div> <div class="w-[200px] px-2">Descricao</div> <div class="w-[100px] text-right">Previsão</div> <div class="w-[100px] text-right">Contábil</div> <div class="w-[100px] text-right">Divergência</div> </div> <div class=flex> <?php foreach($painel as $p): ?> <div class="w-[50px] text-right"><?=$p->conta?></div> <div class="w-[200px] px-2 truncate"><?=$p->descricao?></div> <div class="w-[100px] text-right"> <form action=previsaoAlterar method=post> <input class="w-[100px] text-right" name=previsao value=<?=dec($p->valor)?>> <input type=hidden name=conta value=<?=$p->conta?>> </fom> </div> <div class="w-[100px] text-right"><?=dec($p->fim)?></div> <div class="w-[100px] text-right"><?=dec(abs($p->valor - $p->fim))?></div> <?php endforeach;?> </div>
-
O PHP foi a melhor maneira que eu encontrei para conectar o meu celular com o MySQL. Tanto o PHP como o MySQL estão hospedados na Hostinger. O problema é que o meu conhecimento em PHP é muito precário, ainda não posso jogar fora o programa Excel. Assim, todo ano preciso pagar R$ 459,00 para a Microsoft para eu poder usar o Excel (a assinatura se extende ao Access, ao Word, e muitos programas que não uso). Desde 2022, quando aluguei um espaço na Hostinger, preciso fazer um monte de backup do MySQL para eu poder conectar o Excel no banco de dados. Isso é uma chatice para quem detesta trabalhar, como é o meu caso. Assim, hoje eu pedi ajuda ao Copilot, ele me deixou feliz na hora que ele disse que posso conectar o Excel diretamente no MySQL lá na Hostinger. A minha alegria durou pouco tempo, eu não consegui conectar o meu ODBC à Hostinger. O problema não é só o Windows, é também a Hostinger, eu preciso mexer os pausinhos para o Excel poder consultar o banco de dados, conforme esse tutorial: https://www.hostinger.com/tutorials/mysql/how-to-grant-remote-access-mysql-vps Eu ainda não testei o tutorial, e assim continuo fazendo esse serviço chato do backup. Mas quem está na mesma situação que eu, desejo sorte com o tutorial.
-
Selecionar intervalo entre 2 textos no Word.
pergunta respondeu ao Henrique Sanches de Frank K Hosaka em Microsoft Office
[Copilot] Sub FormatTextInRed() Dim doc As Document Dim rng As Range Dim startPos As Long Dim endPos As Long ' Define the text delimiters Dim startText As String Dim endText As String startText = "aluno1" endText = "aluno2" ' Set the document Set doc = ActiveDocument ' Find the start position Set rng = doc.Content With rng.Find .Text = startText .Forward = True .Wrap = wdFindStop .Execute End With startPos = rng.Start + Len(startText) ' Find the end position Set rng = doc.Content With rng.Find .Text = endText .Forward = True .Wrap = wdFindStop .Execute End With endPos = rng.Start ' Format the text between the start and end positions Set rng = doc.Range(startPos, endPos) rng.Font.Color = wdColorRed End Sub -
O MS Access é bacana, eu apanhei durante 20 anos, e até hoje eu continuo apanhando. Pelo que vi, o problema é que existe uma tabela (tbSocio) com os campos (id,nome) e com os seguintes valores (1,Frank),(2,João),(3,Maria),(4,José),(5,Joaquim),(6,João). Também tem um formulário com o nome de frmSocio, e lá dentro tem um botão de navegação com o desenho do próximo registro (btProximo), e duas caixas de texto (txt_id) e (txt_nome). O problema é bem difícil de resolver: como colocar os registros do tbSocio no frmSocio. O primeiro registro deverá ser executado pelo formulário. Os demais registros devem ser executados pelo botão, assim: Option Compare Database Dim rs As DAO.Recordset Private Sub Form_Load() Set rs = CurrentDb.OpenRecordset("SELECT id, nome FROM tbsocios") If Not rs.EOF Then rs.MoveFirst txt_id.Value = rs.Fields("id").Value txt_nome.Value = rs.Fields("nome").Value End If End Sub Private Sub btProximo_Click() If Not rs.EOF Then rs.MoveNext If Not rs.EOF Then txt_id.Value = rs.Fields("id").Value txt_nome.Value = rs.Fields("nome").Value Else MsgBox "Você chegou ao último registro." rs.MovePrevious ' Volta ao último registro válido End If End If End Sub
-
Eu inventei a rotina da baixa de estoque em 1999, quando trabalhava com MS Access, e adaptei em 2020 no PHP, mas ele é lento demais. A rotina olha toda a tabela de produtos, estuda cada caso, para ver se é necessário fazer ajuste para calcular o estoque presumido. Eu queria simplificar, ao invés de olhar tudo, o melhor é olhar o que precisa. Ou seja, na tabela histórico do produto, eu tenho algo do tipo (666,'2025-02-01',1,10.00), (666,'2025-02-02',1,10.00),(666,'2025-02-03',1,10.00), como eu faço para pegar o último registro? Eu achei a solução lá em 1999, mas ele é péssimo para os padrões de 2025. O lado bom de viver em 2025 é que tem o Copilot, é um serviço de inteligência artificial que a Microsoft não cobra nada. Por enquanto. E hoje, o Copilot me apresentou o WITH, eu nem sabia que isso existia no MySQL: <?php $pdo=new PDO("mysql:host=localhost;dbname=diario","root",""); $sql="WITH Produtos AS ( SELECT tbprod.codprod, prod, id, qt, custototal, ROW_NUMBER() OVER (PARTITION BY tbprod.codprod ORDER BY id DESC) AS rn FROM tbprod JOIN tbhistprod ON tbhistprod.codprod = tbprod.codprod WHERE loc <> 'a24' AND qt > 0 AND lcto <> 15092 and lcto <> 15093 AND dia BETWEEN '2025-02-01' AND '2025-02-28') SELECT codprod,prod,id, qt, custototal FROM Produtos WHERE rn = 1"; $produtos=$pdo->query($sql)->fetchAll(PDO::FETCH_OBJ); echo "<table><th>CodProd<th>Prod<th>Qtotal<th>vTotal<th>Uqt<th>Uvalor<th>AjusteQ<th>AjusteV"; foreach($produtos as $produto) { $previa=$pdo->query("select sum(qt) as qt, sum(custototal) as total from tbhistprod where codprod=$produto->codprod")->fetchAll(PDO::FETCH_OBJ)[0]; if($produto->qt!==$previa->qt) { $ajusteQ=$produto->qt - $previa->qt; $ajusteV=$produto->custototal - $previa->total; echo "<tr><td>$produto->codprod<td>$produto->prod <td>$previa->qt<td>$previa->total<td>$produto->qt<td>$produto->custototal <td>$ajusteQ<td>$ajusteV"; } } echo "</table>";
-
O grande problema do Excel com macro é que ele só funciona no PC. Busquei uma alternativa na planilho do Google, eu e o Copilot perdemos o dia todo tentando fazer a planilha consultar o arquivo tbprod.csv, mas no final eu pedi para o Copilot copiar todo o arquivo na página2 da planilha ativa, e usar a página1 do mesmo jeito que no Excel: Apps Script function copiarConteudoCSVParaPlanilha() { var idArquivoCSV = '1wwN8Z-SR0t0pFhrQOyx9YFYpgSiwaQo_'; // Substitua pelo ID do seu arquivo tbprod.csv try { var arquivo = DriveApp.getFileById(idArquivoCSV); var conteudo = arquivo.getBlob().getDataAsString(); var linhas = Utilities.parseCsv(conteudo); var planilha = SpreadsheetApp.getActiveSpreadsheet(); var folha = planilha.getActiveSheet(); // Limpar qualquer conteúdo existente na planilha folha.clear(); // Copiar o conteúdo do CSV para a planilha folha.getRange(1, 1, linhas.length, linhas[0].length).setValues(linhas); SpreadsheetApp.getUi().alert('Conteúdo do arquivo CSV copiado para a planilha com sucesso!'); } catch (erro) { Logger.log('Erro: ' + erro); SpreadsheetApp.getUi().alert('Ocorreu um erro: ' + erro); } } function onEdit(e) { var folhaAtiva = e.source.getActiveSheet(); var celulaEditada = e.range; var valorCelula = celulaEditada.getValue(); if (folhaAtiva.getSheetName() == 'Página1') { var planilha = SpreadsheetApp.getActiveSpreadsheet(); var folhaBusca = planilha.getSheetByName('Página2'); if (!folhaBusca) { SpreadsheetApp.getUi().alert('A planilha "Página2" não foi encontrada.'); return; } var intervaloBusca = folhaBusca.getRange('A:D').getValues(); for (var i = 0; i < intervaloBusca.length; i++) { if (intervaloBusca[i][0] == valorCelula) { var valorCorrespondente = intervaloBusca[i][3]; // Valor da coluna D // Colocar o valor da coluna D ao lado do valor digitado na Página1 celulaEditada.offset(0, 1).setValue(valorCorrespondente); // Opcional: Exibir um alerta com o valor digitado e o valor correspondente SpreadsheetApp.getUi().alert('O valor digitado é: ' + valorCelula + '. O valor correspondente é: ' + valorCorrespondente); return; } } // Se nenhum valor correspondente for encontrado SpreadsheetApp.getUi().alert('Nenhum valor correspondente encontrado para: ' + valorCelula); } }
-
Botão macro com link para segunda planilha.
pergunta respondeu ao joaoclaudiobrasil de Frank K Hosaka em VBA
Copilot: Sub botao_D1() Sheets("Plan5").Range("B4").Select Range("Plan5!B4").Value = Range("Plan5!B4").Value + 25 End Sub -
O PHP é o único recurso que eu conheço que conecta o MySQL com o HTML, e o Excel é o único recurso que o meu irmão Jorge conhece. Eu ainda não tenho a menor ideia de como fazer o pedido de compra, então decidi usar o PHP para exportar a tabela tbprod, assim: listagem parcial do produto.php function exportar() { $filename = "tbprod.csv"; header('Content-Type: text/csv'); header('Content-Disposition: attachment;filename="' . $filename . '"'); header('Pragma: no-cache'); header('Expires: 0'); $file = fopen('php://output', "w"); fputcsv($file, array('codprod', 'un', 'prod','custo','marg', 'codbar','loc','emb','cf','codforn','estoque','venda','cfop'), ',', '"', "\\"); $result = (new conn)->select("* from tbprod where loc <> 'a24' order by prod"); if ($result && count($result) > 0) { foreach($result as $row) { fputcsv($file, (array)$row, ',', '"', "\\"); } require('menuView.php'); echo "Dados exportados com sucesso para " . $filename; } else { echo "Nenhum registro encontrado na tabela tbprod."; } fclose($file); } Para o meu irmão usar o arquivo tbprod.csv, eu criei a planilha SoFuncionaNoPC.xlms, com o seguinte código VBA Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ' Adicione o código que você deseja executar ao dar duplo clique na célula If Not Intersect(Target, Me.Range("A1:Z100")) Is Nothing Then Dim valorProcurado As String Dim csvFilePath As String Dim csvFile As Workbook Dim csvSheet As Worksheet Dim activeSheet As Worksheet Dim found As Range Dim linhaAtual As Long Dim colunaAtual As Long ' Define o valor a ser procurado valorProcurado = ActiveCell.Value linhaAtual = ActiveCell.Row colunaAtual = ActiveCell.Column ' Caminho relativo para o arquivo CSV (no mesmo diretório da planilha atual) csvFilePath = ThisWorkbook.Path & "\tbprod.csv" ' Abre o arquivo CSV de forma oculta Application.ScreenUpdating = False Set csvFile = Workbooks.Open(csvFilePath) Set csvSheet = csvFile.Sheets(1) csvFile.Windows(1).Visible = False Set activeSheet = ThisWorkbook.activeSheet ' Procura pelo valor na coluna A (primeira coluna) Set found = csvSheet.Columns(1).Find(What:=valorProcurado, LookIn:=xlValues, LookAt:=xlWhole) ' Se encontrar o valor, copia a linha correspondente para a planilha ativa If Not found Is Nothing Then activeSheet.Cells(linhaAtual, colunaAtual + 1).Value = found.Offset(0, 2).Value Else MsgBox "Valor " & valorProcurado & " não encontrado no arquivo CSV.", vbExclamation End If ' Fecha o arquivo CSV csvFile.Close SaveChanges:=False Cancel = True ' Cancela a edição padrão de célula ao dar duplo clique End If End Sub Esse código vai no painel do código da planilha ativa. Por enquanto o programa é bem inútil, mas eu gostei. O meu irmão vai em uma célula qualquer, digita um valor, e ao dar um duplo clique na célula, o VBA vai até o tbprod.csv e traz a descrição do produto, se ele encontrar e coloca do lado da célula ativa.
-
Localizar e selecionar intervalo entre 2 textos no Word
pergunta respondeu ao Henrique Sanches de Frank K Hosaka em Visual Basic
Eu não entendi bem o problema, mesmo assim, tentei alterar o código assim: Public Sub Teste() Dim startText As String Dim endText As String Dim startPos As Long Dim endPos As Long Dim doc As Document Dim rng As Range Dim searchPos As Long startText = "End.: " endText = "Bairro: " Set doc = ActiveDocument searchPos = 1 Do startPos = InStr(searchPos, doc.Content.Text, startText) If startPos = 0 Then Exit Do endPos = InStr(startPos + Len(startText), doc.Content.Text, endText) If endPos = 0 Then Exit Do Set rng = doc.Range(startPos + Len(startText) - 1, endPos - 1) 'Substituir quebras de parágrafo por espaço rng.Text = Replace(rng.Text, vbCr, " ") searchPos = endPos + Len(endText) Loop End Sub -
Como capturar HTML editado no Textarea usando JavaScript?
pergunta respondeu ao claugo de Frank K Hosaka em Java
arquivo index.php <script src="https://cdn.tailwindcss.com"></script> <div class="w-[1000px] mt-5 flex m-0 m-auto"> <textarea rows="10" cols="50" class="border border-1 border-black" oninput="replica.innerText=this.value"> </textarea> <div id=replica class="w-[500px] h-[300px] border border-black"> </div> </div> -
Depois de 30 anos, finalmente descobri um jeito de tirar o texto de um pdf. A dica foi do Deep Seek: basta abrir o PDF no Adobe Reader, selecionar o texto, copiar e colar num arquivo texto. Nunca pensei que fosse tão fácil. Com arquivo de texto dá fazer uma festa com o PHP: arquivo fera.txt 103898 2,00 REPOLHO ROXO 1,00 8,82 17,64 RUA A - BOX 27 103899 1,00 REPOLHO FATIADO NO MEIO 1,00 8,82 8,82 RUA A - BOX 35 arquivo index.php <?php // Define o caminho para o arquivo de texto $caminhoArquivo = 'fera.txt'; // Abre o arquivo para leitura $arquivo = fopen($caminhoArquivo, 'r'); if ($arquivo) { // Lê o conteúdo do arquivo linha por linha while (($linha = fgets($arquivo)) !== false) { $pos=strpos($linha," RUA"); $separar=substr($linha,0, $pos); echo $separar . "<br>"; $partes = explode(" ", $separar); // Atribui cada parte a uma variável correspondente $codigo = array_shift($partes); echo "codigo $codigo <br>"; $qt1 = array_shift($partes); echo "qt1 $qt1 <br>"; $total = array_pop($partes); echo "total $total <br>"; $unitario = array_pop($partes); echo "unitario $unitario <br>"; $qt2 = array_pop($partes); echo "qt2 $qt2 <br>"; $descricao = implode(' ', $partes); echo "descricao $descricao <br><br>"; } // Fecha o arquivo fclose($arquivo); } ?> // resultado: 103898 2,00 REPOLHO ROXO 1,00 8,82 17,64 codigo 103898 qt1 2,00 total 17,64 unitario 8,82 qt2 1,00 descricao REPOLHO ROXO 103899 1,00 REPOLHO FATIADO NO MEIO 1,00 8,82 8,82 codigo 103899 qt1 1,00 total 8,82 unitario 8,82 qt2 1,00 descricao REPOLHO FATIADO NO MEIO
-
Erro em tempo de execução 9 Subscrito fora do intervalo
pergunta respondeu ao Barabara Amorim de Frank K Hosaka em Tutoriais & Dicas - MS Office
Eu não consegui resolver o problema, mas gostei bastante do código, o problema é que o Excel travou e assim eu pedi ajuda para o Copilot, e a sugestão dele deu certo. Eu montei uma nova planilha com o nome de Geral, onde célula A1=Digite Aqui, B1=Data, C1=Hora, D1=Soma(a2:a20), e o código ficou assim: Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False ' Desativa eventos temporariamente On Error GoTo ExitSub ' Tratamento de erros para garantir que eventos sejam reativados If Target.Row > 1 Then If Target.Column = 1 Then Cells(Target.Row, 2) = Date Cells(Target.Row, 3) = Time Cells(Target.Row, 4) = Sheets("Geral").Cells(1, 4).Value End If End If ExitSub: Application.EnableEvents = True ' Reativa eventos End Sub -
Para facilitar eu simplifiquei tudo, ao invés de duas, eu só fiz uma planilha chamada tarefas, onde a coluna A representa o cliente, a coluna b status e a coluna c data. Para o formulário controle, usei o UserForm e dei o nome de frmControle, com duas caixas de texto (txtCliente, txtStatus), um botão (cmdPular) e um comboBox (cboStatus), e eles usam esse código: Dim ultimaLinhaPesquisada As Long Private Sub UserForm_Initialize() cboStatus.AddItem "Realizado" cboStatus.AddItem "Em Aberto" cboStatus.AddItem "Agendado" cboStatus.AddItem "Cancelado" ultimaLinhaPesquisada = 2 ' Começa na linha 2, assumindo que a linha 1 contém os cabeçalhos PesquisarProximaLinha End Sub Private Sub PesquisarProximaLinha() Dim ws As Worksheet Dim statusValue As String ' Definir a planilha "tarefas" Set ws = ThisWorkbook.Sheets("tarefas") ' Procurar a próxima linha com Status diferente de "Realizado" ou "Cancelado" For i = ultimaLinhaPesquisada To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row statusValue = ws.Cells(i, 2).Value ' Coluna B contém o status If statusValue <> "Realizado" And statusValue <> "Cancelado" Then ' Copiar valores para os controles do UserForm Me.txtCliente.Value = ws.Cells(i, 1).Value ' Coluna A para txtCliente Me.txtStatus.Value = ws.Cells(i, 2).Value ' Coluna B para txtStatus ' Ativar a célula na coluna B da linha pesquisada ws.Cells(i, 2).Activate ultimaLinhaPesquisada = i Exit For End If Next i End Sub Private Sub cmdPular_Click() PesquisarProximaLinha End Sub Private Sub cboStatus_Change() Dim ws As Worksheet Dim statusValue As String ' Definir a planilha "tarefas" Set ws = ThisWorkbook.Sheets("tarefas") ' Verificar o valor selecionado na ComboBox statusValue = Me.cboStatus.Value If statusValue = "Realizado" Or statusValue = "Cancelado" Or statusValue = "Em Aberto" Then ' Atualizar o status na coluna B na linha específica ws.Cells(ultimaLinhaPesquisada, 2).Value = statusValue ' Colocar a data atual na coluna C na linha específica ws.Cells(ultimaLinhaPesquisada, 3).Value = Date End If Me.cboStatus = "" End Sub Para chamar o formulário dentro da planilha, você vai precisar de um módulo, e lá dentro outro código: Sub ExibirControle() frmControle.Show End Sub Com esse código, vai ser possível usar o comando Desenvolvedor > Macros > ExibirControle. Esse programa não prevê um código para Agendado, eu não tive tempo, mas espero que ele lhe ajude.
-
A lógica é a mesma que comentei no texto anterior quando falei do fusca de 3 assentos, esse aqui tem desenho. arquivo config.php <?php class bd { private static $bindings = []; private static $initialized = false; private static $query; private static $pdo; static function get() { $stmt = self::getPdo()->prepare(self::$query); if (!empty(self::$bindings)) { foreach (self::$bindings as $key => $value) { $stmt->bindValue(":$key", $value); } } $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_OBJ); self::$query = ''; self::$bindings = []; return $result; } static function get1() { self::$query .= " LIMIT 1"; $stmt = self::getPdo()->prepare(self::$query); if (!empty(self::$bindings)) { foreach (self::$bindings as $key => $value) { $stmt->bindValue(":$key", $value); } } $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_OBJ)[0]; self::$query = ''; self::$bindings = []; return $result; } protected static function getPdo() { self::initialize(); return self::$pdo; } static function getv($column) { $stmt = self::getPdo()->prepare(self::$query); if (!empty(self::$bindings)) { foreach (self::$bindings as $key => $value) { $stmt->bindValue(":$key", $value); } } $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC); self::$query = ''; self::$bindings = []; return $result[$column] ?? null; } static function getx() { $stmt = self::getPdo()->prepare(self::$query); if (!empty(self::$bindings)) { foreach (self::$bindings as $key => $value) { $stmt->bindValue(":$key", $value); } } $stmt->execute(); return; } static function initialize() { if (!self::$initialized) { $dsn = 'mysql:host=localhost;dbname=teste'; self::$pdo = new PDO($dsn, 'root',''); self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); self::$initialized = true; } } static function x($sql,$bindings=[]) { self::initialize(); self::$query=$sql; self::$bindings=$bindings; return new static; } } arquivo index.php <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Poltronas do Ônibus</title> <style> table { width: 50%; border-collapse: collapse; margin: 0 auto; } td { width: 20%; border: 1px solid #000; text-align: center; padding: 10px; } .floor-label { font-weight: bold; text-align: center; background-color: #f0f0f0; padding: 10px; } .corridor { width: 20%; background-color: #ddd; } .seat-button { width: 100%; height: 100%; background: none; border: none; cursor: pointer; } .reserved { background-color: red; color: white; } .selected { background-color: blue; color: white; } </style> </head> <body> <table> <?php require('config.php'); $seats = range(1, 64); // Poltronas de 1 a 64 $floors = [ 'Piso 1' => array_slice($seats, 48, 16), // Poltronas 49 a 64 'Piso 2' => array_slice($seats, 0, 48) // Poltronas 1 a 48 ]; foreach ($floors as $floor => $seats) { echo "<tr><td colspan='5' class='floor-label'>$floor</td></tr>"; for ($i = 0; $i < count($seats); $i += 4) { echo "<tr>"; for ($j = 0; $j < 4; $j++) { if ($j == 2) { echo "<td class='corridor'></td>"; } $seat = $seats[$i + $j]; // Verificar se a poltrona está reservada $ver = bd::x("SELECT poltrona FROM poltrona WHERE poltrona = :poltrona", ['poltrona' => $seat])->get(); $reserved_class = !empty($ver) ? 'reserved' : ''; echo "<td><form method='post' action=''><button type='submit' name='seat' value='$seat' class='seat-button $reserved_class' id='seat-$seat' onclick='highlightSeat($seat)'>$seat</button></form></td>"; } echo "</tr>"; } } // Verificar qual poltrona foi selecionada if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['seat'])) { $selected_seat = $_POST['seat']; // Verificar se a poltrona não está reservada $ver = bd::x("SELECT poltrona FROM poltrona WHERE poltrona = :poltrona", ['poltrona' => $selected_seat])->get(); if (empty($ver)) { bd::x("INSERT INTO poltrona (poltrona) VALUES (:poltrona)", ['poltrona' => $selected_seat])->getx(); echo "<script>location.reload()</script>"; } else { echo "<p>Poltrona já reservada: $selected_seat</p>"; } } ?> </table> </body> </html>