Excel

30 отговора 0 прегледа
#1

Excel

Имам следното питане? Може ли да се намери с функция/формула/ число, което е заедно с други думи в клетката? Например: "Телевизор - 999 лв."; "Утре ще бъде около 7 градуса".. и т.н. Примерите са съвсем произволни, целта е да се извлекат числата от текста с помощта на формула да речем? Моля за конкретно предложение, което е тествано..))) thanks

Отговор
в отговор на zima #2

Re: Excel

Най-добрия вариант, за който се сещам е функцията във VBA "IsNumeric", след като си сплитнал текста на парчета, и ги обхождаш едно по едно.

Пример:
Private Sub CommandButton1_Click()

OrigText = Sheet1.Range("A1")
Parts = Split(OrigText, " ")
Founded = 0
For Count = 0 To UBound(Parts)
If IsNumeric(Parts(Count)) Then
Founded = Founded + 1
Sheet1.Range("B" & Founded) = Parts(Count)
End If
Next
End Sub


Ще се получи нещо такова:



Щирлиц
Отговор
в отговор на Щиpлиц #3

Re: Excel

Много благодаря, агенте!.. , но само да попитам пак, понеже сега прохождам във VBA.. и не съм стигнал до тез бутони, как точно се създават и стартират. А за появата на резултата в съседната колона се задейства функцията от стандартното меню или е вградена в този бутон?!

Ето нещо, което върши работа обаче само, ако в текстовия низ има една цифра, щото ги наслагва всичките една до друга, ако са повече.. :)

Function ExtractNumber(rCell As Range)
Dim lCount As Long, l As Long
Dim sText As String
Dim lNum As String

sText = rCell

For lCount = Len(sText) To 1 Step -1
If IsNumeric(Mid(sText, lCount, 1)) Then
l = l + 1
lNum = Mid(sText, lCount, 1) & lNum
End If

If l = 1 Then lNum = CInt(Mid(lNum, 1, 1))
Next lCount

ExtractNumber = CLng(lNum)
End Function

Отговор
в отговор на zima #4

Re: Excel

Кода, който даваш е лош. Извършва много ненужни операции, търси в стринга буква по буква, и на всичкото отгоре работи само с цели числа.

Моя код също има недостатък. Ако за числата са залепени някакви други символи - въпросните числа се пропускат.

Но пък мислех да спретнем нещо по-универсално. Например можем да го направим така - от стринга се заместват с интервали всички символи, които не са цифри или точка, след това всички двойни интервали се заменят с по един интервал, и едва накрая се разделя стринга на части. Но да се разработва без идея къде и за какви цели ще се прилага - не става.

Бутоните се слагат в режим "Design mode", и кода за тяхното изпълнение се пише в VBA редактора.

Щирлиц
Отговор
в отговор на Щиpлиц #5

Re: Excel

Да, хубаво е да се разработи при по-конкретни намерения, но засега е само като учебен процес..)) За бутона, стигнах до някъде, сложих кода; от макросите го избрах, но нещо не се активира, не знам как да го вържа да стане видим в таблицата.. Мисля, че някъде в properties се добавя нещо, но нямам представа още как..))

Отговор
в отговор на zima #6

Re: Excel

Design mode бре човек!!!

Виж дали въобще ти е активен тулбара "Control Toolbox". Ако не е - отвори го да се вижда, и оттам си вземаш бутон.

Щирлиц
Отговор
в отговор на Щиpлиц #7

Re: Excel

Това го направих още първия път, взех бутона, и го сложих в User form при Design mode, но как да се появи в страницата и да се върже с кода?! :)))))))) Ох, че мноооггоо имам да учааа..))

Отговор
в отговор на zima #8

Re: Excel

Но никъде не съм споменавал за User form. ;о))))

На екрана на Excel, в горната част има тулбарове. Те могат да се включват и изключват. Един от тях е "Control toolbox", и първото бутонче от него включва Design mode. Като включиш на този режим, можеш да поставяш бутончета, чек-боксове и падащи списъци от тулбара. Още докато си в Design mode, с двукратно кликване върху бутонче, или какъвто и да е подобен контрол - преминаваш направо към VBA редактора, и там пишеш кода.

Хайде опитай пак. И бъди точен с терминологията.

Щирлиц
Отговор
в отговор на Щиpлиц #9

Re: Excel

Проработииииииии..))) Браво! ГОЛЯМО БЛАГОДАРЯ!
А ако е колона и да изтегля числата от всеки ред в съседните, толкова на брой, колкото са числата в реда?! И, за да не те притеснявам /достатъчно време и внимание ми отдели/, просто някаква литература хубава да ми препоръчаш на български за VBA, да се уча де.. щото имам Макросите в Ексел, но не всичко е последователно и от нулата обяснено.. та импровизирам малко, но.. ще видим.. Стискам ти ръката, благодаря още веднъж!

Отговор
в отговор на zima #10

Re: Excel

Ми, да опитаме така:

Private Sub CommandButton1_Click()

Dim R As Long, OrigText As String, Parts() As String, Founded As Integer, Count As Integer

' Установява променливата за редовете (почва от 1)
R = 1

Do Until Sheet1.Range("A" & R) = ""

' Взема съдържанието на клетката в колона "А"
OrigText = ShrinkText(Sheet1.Range("A" & R))
' Разделя стринга на части
Parts = Split(OrigText, " ")
Founded = 0

For Count = 0 To UBound(Parts)
' Вече няма нужда от проверка, но все пак нека оставим функцията IsNumeric
If IsNumeric(Parts(Count)) Then
' Намерил е нещо!!!
Founded = Founded + 1
' Разполага полученото число в клетка на ред R и колона Founded + 1
Sheet1.Cells(R, Founded + 1) = Parts(Count)
End If
Next

' Преминава на следващия ред
R = R + 1

Loop

End Sub

Private Function ShrinkText(strText As String) As String
Dim cnChars As String, Count As Long

cnChars = ".0123456789"

' Сравнява всеки знак от стринга, и ако не е цифра или точка - го замества с интервал
For Count = 1 To Len(strText)
If InStr(cnChars, Mid(strText, Count, 1)) = 0 Then
Mid(strText, Count, 1) = " "
End If
Next

' Премахва всички двойни интервали в стринга
Do Until InStr(strText, " ") = 0
strText = Replace(strText, " ", " ")
Loop
' Премахва интервали в началото и края на стринга
strText = Trim(strText)

' Връща получения резултат
ShrinkText = strText

End Function



Ще се получи нещо такова:



Щирлиц
Отговор
в отговор на Щиpлиц #11

Re: Excel

Забравих за книгата. Имам много добра книга за Excel, но за твое съжаление - е на английски. Иначе много хубаво са описали функциите, форматирането на клетките, разни хитринки... Ако искаш - все пак мога да ти я пратя по мейла, или по ICQ, каквото имаш там. Пиши на лична бележка.

Щирлиц
Отговор
в отговор на Щиpлиц #12

Re: Excel

Работи перфектно! Но, да уточня някои неща, които ми направиха впечатление. Щях направо да ги копирам, но тук не става по-обичайния начин, явно иска да са качени някъде и после да е посочен пътя до тях, това друга тема..)) Та, при стартиране на програмата написах същите примери като твоите, понеже са интересни.. и добавих някои мои, за експеримента.. 1) В 17,30 часа ще се ходи в Метро - изкарва ми двете цифри /17 и 30/ в две различни колони, но поне ги разграничава. 2) На 17-ти ще има концерт в 19,30 - три колонки, с три цифри.. разграничава и когато има знак тире до цифрата, а другото аналогично на първото. 3) Влакът тръгва в 16.35 часа и пристига в 19.05 - тук е сложена точка и не изкарва нищо. 4) Автобусът е от 6,00 часа и на всеки 30 минути - изкарва 6 - 0 - 30, т.е. двете нули ги преобразува в една, разгнаничава пак цифрите около запетаята.. Такааа.. сега, една проба направих пак! Добавям към всичкото това и следващите редове. 5) проба 10... и 6) проба 20 - натискам бутона, визуализират се и числата 10 и 20 едно под друго, както си трябва.. След което, изтривам съдържанието в клетката" 5) проба 10.. " Натискам Ctr button1 и числото 10 си остава на място, не се премахва, след като няма нищо в клетката преди него на същия ред.. После, добавям и нов ред 7) денонощието е 24 часа - натискам бутона, нищо.. След което връщам отново съдържанието 5) проба 10 - добавям и ред 8) Прасето тежи 150кг. - Натискам - ВСИЧКО СЕ ВИЗУАЛИЗИРА! БРАВО! Е, това ми бяха експериментите..)) Интересно е..))
Още нещо, за да запаметя така сложения код към книгата ми иска да намаля сигурността на макроса от висока на средна, иначе не ще?!
И ще трябва да се регистрирам, за да мога да пратя лична бележка..

Отговор
в отговор на zima #13

Re: Excel

Няма да мога да отговоря по ред на номерата, но накратко:
Кода го оптимизирах да търси ЦИФРИ в стринга. Т.е. в онази константа cnChars са записани като условие символите, които могат да участват в едно число. Ако запишеш 6,30 - се третират като две числа, защото между цифрите има запетая. Функцията ShrinkText е новото, което промених, защото в предишния вариант, ако за числото има залепен друг символ - вече не се третира като число. А по този начин от "52%" например - ще получиш числото "52". По принцип за десетичен разделител се ползва точка, затова запетаята дели числата на две. Може да се добави в променливата cnChars и запетая, че и двуеточие даже, но така числата няма да се третират като числа от IsNumeric, и трябва да се махне проверката с тази функцията, и да се остави само на първата логика в написаната от нас ShrinkText. Тогава вече с добавяне на запетая, двуеточие и даже тире в cnChars - ще постигнеш правилно третиране на стрингове като "6:45", "6,30", "12-50"... Всичко е по твой избор.

Когато вече си претърсвал стринговете - в полоните отдясно са получени резултатите, и изпълнението на бутона НЕ изтрива стари резултати. В смисъл - ако в някой ред промениш текста, и останат по-малко на брой числа - старите числа остават в колоните надясно. Може да се добави малка функция, която да изтрива стари данни ето така:

...стария код

...
Founded = 0

Cols = 2
Do Until Sheet1.Cells(R, Cols) = ""
Sheet1.Cells(R, Cols) = ""
Cols = Cols + 1
Loop


For Count = 0 To UBound(Parts)
...
...


Добавям само пет нови реда, намери им мястото там, и да видим дали ще изтрива излишните числа.

Щирлиц
Отговор
в отговор на zima #14

Re: Excel

Забравих да спомена - цикъла за обхождане на редовете от 1 надолу - се завърта, докато срещне празен ред, и тогава спира. Така че ако изтриеш съдържанието на някой ред - следващите след него няма да се обработват. За да не се случва това - записвай поне някакъв символ в полето, та ако ще и само един интервал да е.

Щирлиц
Отговор
в отговор на Щиpлиц #15

Re: Щиpлиц

Моля за консултация в ексел в клетка с адрес А1 пиша 35лв, в клетка с адрес В1 пиша 10лв. После задавам в клетка с адрес С1 формулата =A1*B1, резултата в клетка с адрес С1 е 350, но защо не се изписва лв., какво да направя за де се изписва 350 лв. Благодаря.

Отговор
в отговор на yчaщ ce #16

Re: Щиpлиц

О, божке, леле, слез да си прибереш вересиите........ ;о)

За да се появява "лв", или каквото си избереш там в клетката с числото - кликваш десен бутон върху въпросната клетка, избираш "Format cells", и от диалоговия прозорец правиш избор как искаш да се визиализира клетката. Дали да е число, текст, дата, или парична стойност. Намери си това, което на теб конкретно ти е нужно, и просто го маркирай, и натисни Ok.

Щирлиц
Отговор
в отговор на Щиpлиц #17

Re: Щиpлиц

Да, благодаря ти много, направих го, но не намерих как мога да задам бр.

Отговор
в отговор на yчaщ ce #18

Re: Щиpлиц

Във "Format cells" задаваш "Custom", и отдясно в полето type въвеждаш: # ##0_ бр.

Щирлиц
Отговор
в отговор на Щиpлиц #19

Re: Щиpлиц

Да благодаря ти много, извини ме за безпокойството.

Отговор
в отговор на yчaщ ce #20

Re: Щиpлиц

Извини ме много но ако умножавам лв. по бр. не мога да получа резултата в лв.

Отговор